【发布时间】:2019-06-20 04:36:40
【问题描述】:
我有这段代码试图通过添加持续时间来创建新的 time_point:
// now
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
// duration
std::chrono::duration<float> duration(1.0f / 60.0f); // float in seconds
// now + duration
std::chrono::system_clock::time_point futureTime = now + duration;
但它给了我这个错误
error: conversion from 'std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<float, std::ratio<1, 1000000000> > >' to non-scalar type 'std::chrono::_V2::system_clock::time_point {aka std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >}' requested
# it's over there in the distance --->
# ... again, with some manual formatting:
error:
conversion from
'std::chrono::time_point<std::chrono::_V2::system_clock,
std::chrono::duration<float,
std::ratio<1, 1000000000> > >'
to non-scalar type
'std::chrono::_V2::system_clock::time_point
{aka
std::chrono::time_point<std::chrono::_V2::system_clock,
std::chrono::duration<long int,
std::ratio<1, 1000000000> > >}'
requested
经过一番严重的眯眼之后,第一个是float,第二个是long int。因此,now (long int) + duration (float) 给出了一个带有一些内部浮点持续时间的 time_point,我大概要求将其填充回默认的 long int 表示中。
我想最终将这个时间点传递给std::condition_variable::wait_until。如何强制转换为std::chrono::system_clock::time_point?
如果这样做,我会失去什么样的精度(即它是否存储毫秒,在这种情况下我会失去一些 1 / 60)?
如果我不转换它,那么编写now + duration 返回的类型的简短方法是什么(是的,我可以使用 auto 但为了将其传递给函数)?
【问题讨论】:
-
"它是否存储毫秒数" 它存储你要求它存储的内容。另外,如果你想等待 1/60 秒,有什么理由不能只使用
wait_for,因为这正是它的目的? -
旁注:在 Windows 中让事情在 1/60 秒内发生可能很烦人,因为 Windows 使用 1/64 滴答声。
-
@NicolBolas
std::chrono::system_clock::time_point似乎隐含地将纳秒与std::ratio<1, 1000000000>一起使用。我没有要求它这样做。我想等到 1/60 秒过去了,使用wait_until我可以继续调用它,直到我被打断时它超时,这与 wait_for 不同。