convert seconds as double to std::chrono::duration?

吃可爱长大的小学妹 提交于 2019-12-23 06:47:17

问题


I'm using c++11 <chrono> and have a number of seconds represented as a double. I want to use c++11 to sleep for this duration, but I cannot fathom how to convert it to a std::chrono::duration object that std::this_thread::sleep_for requires.

const double timeToSleep = GetTimeToSleep();
std::this_thread::sleep_for(std::chrono::seconds(timeToSleep));  // cannot convert from double to seconds

I've locked at the <chrono> reference but I find it rather confusing.

Thanks

EDIT:

The following gives error:

std::chrono::duration<double> duration(timeToSleep );
std::this_thread::sleep_for(duration);

the error:

:\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

回答1:


Don't do std::chrono::seconds(timeToSleep). You want something more like:

std::chrono::duration<double>(timeToSleep)

Alternatively, if timeToSleep is not measured in seconds, you can pass a ratio as a template parameter to duration. See here (and the examples there) for more information.




回答2:


Making the answer from @Cornstalks a little more generic, you could define a function like this:

template <typename T>
auto seconds_to_duration(T seconds) {
    return std::chrono::duration<T, std::ratio<1>>(seconds);
}

This will convert a seconds value of any primitive type to a chrono duration. Use it like this:

const double timeToSleep = GetTimeToSleep();
std::this_thread_sleep_for(seconds_to_duration(timeToSleep));



回答3:


const unsigned long timeToSleep = static_cast<unsigned long>( GetTimeToSleep() * 1000 );
std::this_thread::sleep_for(std::chrono::milliseconds(timeToSleep));



回答4:


std::chrono::milliseconds duration(timeToSleep);
std::this_thread::sleep_for( duration );


来源:https://stackoverflow.com/questions/17899684/convert-seconds-as-double-to-stdchronoduration

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!