Kai*_*aan 26 c++ c++11 c++-chrono
我正在使用c ++ 11 <chrono>并且有一些秒表示为double.我想在这段时间内使用c ++ 11来休眠,但我无法理解如何将它转换为需要的std::chrono::duration对象std::this_thread::sleep_for.
const double timeToSleep = GetTimeToSleep();
std::this_thread::sleep_for(std::chrono::seconds(timeToSleep)); // cannot convert from double to seconds
Run Code Online (Sandbox Code Playgroud)
我已经锁定了<chrono>参考,但我发现它相当令人困惑.
谢谢
编辑:
以下给出了错误:
std::chrono::duration<double> duration(timeToSleep );
std::this_thread::sleep_for(duration);
Run Code Online (Sandbox Code Playgroud)
错误:
:\program files (x86)\microsoft visual studio 11.0\vc\include\chrono(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.0\vc\include\chrono(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.0\vc\include\thread(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:\users\johan\desktop\svn\jonsengine\jonsengine\src\window\glfw\glfwwindow.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
Run Code Online (Sandbox Code Playgroud)
Cor*_*lks 23
不要这样做std::chrono::seconds(timeToSleep).你想要更像的东西:
std::chrono::duration<double>(timeToSleep)
Run Code Online (Sandbox Code Playgroud)
或者,如果timeToSleep未在几秒钟内测量,则可以将比率作为模板参数传递给duration.有关更多信息,请参见此处(以及其中的示例).
使@Cornstalks的答案更加通用,您可以定义如下函数:
template <typename T>
auto seconds_to_duration(T seconds) {
return std::chrono::duration<T, std::ratio<1>>(seconds);
}
Run Code Online (Sandbox Code Playgroud)
这会将任何原始类型的秒值转换为计时持续时间。像这样使用它:
const double timeToSleep = GetTimeToSleep();
std::this_thread_sleep_for(seconds_to_duration(timeToSleep));
Run Code Online (Sandbox Code Playgroud)
小智 5
以上都不适合我。找到了工作解决方案作为另一个问题的答案:
从双秒到 std::chrono::steady_clock::duration 的简洁转换?
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));
Run Code Online (Sandbox Code Playgroud)
这会将 a 转换double为 a std::chrono::steady_clock::duration。
一般来说,当使用标准时钟(例如 )时steady_clock,持续时间变量应始终是该时钟的成员类型,例如std::chrono::steady_clock::duration。
避免从模板创建您自己的持续时间类型,例如std::chrono::duration<double>,除非临时使用,duration_cast如上所示。
这使得时间与std::chrono::steady_clock::now()最快的进行比较,因为它避免了运行时不必要的转换,因为变量的持续时间类型已经与 . 返回的持续时间类型time_point匹配now()。