将秒转换为std :: chrono :: duration?

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.有关更多信息,请参见此处(以及其中的示例).


Ala*_*son 5

使@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()