将秒转换为std::chrono::duration
convert seconds as double to std::chrono::duration?
我使用的是c++11 <chrono>
,秒数用双精度表示。我想使用c++11在这段时间内休眠,但我无法理解如何将它转换为std::this_thread::sleep_for
所需的std::chrono::duration
对象。
const double timeToSleep = GetTimeToSleep();
std::this_thread::sleep_for(std::chrono::seconds(timeToSleep)); // cannot convert from double to seconds
我已经锁定了<chrono>
引用,但我发现它相当令人困惑。
感谢
编辑:
以下给出错误:
std::chrono::duration<double> duration(timeToSleep );
std::this_thread::sleep_for(duration);
错误:
c:program files (x86)microsoft visual studio 11.0vcincludechrono(749): error C2679: binary '+=' : no operator found which takes a right-hand operand of type 'const std::chrono::duration<double,std::ratio<0x01,0x01>>' (or there is no acceptable conversion)
2> c:program files (x86)microsoft visual studio 11.0vcincludechrono(166): could be 'std::chrono::duration<__int64,std::nano> &std::chrono::duration<__int64,std::nano>::operator +=(const std::chrono::duration<__int64,std::nano> &)'
2> while trying to match the argument list '(std::chrono::nanoseconds, const std::chrono::duration<double,std::ratio<0x01,0x01>>)'
2> c:program files (x86)microsoft visual studio 11.0vcincludethread(164) : see reference to function template instantiation 'xtime std::_To_xtime<double,std::ratio<0x01,0x01>>(const std::chrono::duration<double,std::ratio<0x01,0x01>> &)' being compiled
2> c:usersjohandesktopsvnjonsenginejonsenginesrcwindowglfwglfwwindow.cpp(73) : see reference to function template instantiation 'void std::this_thread::sleep_for<double,std::ratio<0x01,0x01>>(const std::chrono::duration<double,std::ratio<0x01,0x01>> &)' being compiled
不要执行std::chrono::seconds(timeToSleep)
。你想要更像的东西
std::chrono::duration<double>(timeToSleep)
或者,如果timeToSleep
不是以秒为单位测量的,则可以将比率作为模板参数传递给duration
。有关更多信息,请参阅此处(以及那里的示例)。
让@Cornstars的答案更通用一点,你可以定义一个这样的函数:
template <typename T>
auto seconds_to_duration(T seconds) {
return std::chrono::duration<T, std::ratio<1>>(seconds);
}
这将把任何基元类型的秒值转换为计时持续时间。这样使用:
const double timeToSleep = GetTimeToSleep();
std::this_thread_sleep_for(seconds_to_duration(timeToSleep));
const unsigned long timeToSleep = static_cast<unsigned long>( GetTimeToSleep() * 1000 );
std::this_thread::sleep_for(std::chrono::milliseconds(timeToSleep));
以上这些对我都不起作用。找到的有效解决方案是对另一个问题的回答:
从两秒到std::chrono::steady_clock::duration的Terse转换?
double period_in_seconds = 3.4;
auto as_duration = std::chrono::duration_cast<std::chrono::steady_clock::duration>(std::chrono::duration<double>(period_in_seconds));
这将double
转换为std::chrono::steady_clock::duration
。
通常,使用标准时钟(如steady_clock
)时,持续时间变量应始终为该时钟的成员类型,如std::chrono::steady_clock::duration
。
避免从模板中创建自己的工期类型,例如std::chrono::duration<double>
,除非如上所示与duration_cast
一起临时使用。
这使得与std::chrono::steady_clock::now()
的时间比较最快,因为它避免了运行时不必要的转换,因为变量的持续时间类型已经与now()
返回的time_point
的持续时间匹配。
std::chrono::milliseconds duration(timeToSleep);
std::this_thread::sleep_for( duration );
您可以使用*operator
重载将double转换为std::chrono::duration<double>
,然后将其强制转换为所需的句点。
double start;
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>
(
std::chrono::seconds{1} * start
);
- 从持续时间构造std::chrono::system_clock::time_point
- 如何在c++迭代器类型中包装std::chrono
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用 memcpy() 复制到 std::chrono::milliseconds 会给出错误 -Werror=clas
- std::multimap<std::chrono::milliseconds, T>::rbegin 在 MSVS-13 中指向 end()?
- 如何在C++中将 chrono::秒转换为 HH:MM:SS 格式的字符串?
- C++ Chrono 确定一天是否是周末?
- std::adjacent_difference with std::chrono time_point
- VSCode 说 std::chrono 是模棱两可的,如果运算符<<重载
- 是否确保 2 个连续的 std::chrono::steady_clock::now() 不相等?
- std::chrono::duration::count函数的实际结果类型是什么
- std::hash for std::chrono::duration
- 尝试转换 std::chrono::d uration 会导致"rep cannot be a duration"编译错误
- SFINAE将实例化类型限制为std::chrono::duration类型
- Example of C++ 11 std::chrono::duration
- std线程sleep_for不适用于某些chrono::duration
- std::chrono::duration::duration()怎么可能是constexpr
- 将秒转换为std::chrono::duration
- 带有std::chrono::duration的用户定义重载操作符*
- 如何重置chrono::duration值