преобразовать секунды как double в std::chrono:: duration?
Я использую c++11 <chrono>
и имеют несколько секунд, представленных в виде двойника. Я хочу использовать 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
я заперся в <chrono>
ссылка, но я нахожу это довольно запутанным.
спасибо
EDIT:
далее дает ошибку:
std::chrono::duration<double> duration(timeToSleep );
std::this_thread::sleep_for(duration);
ошибки:
: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
4 ответов
не std::chrono::seconds(timeToSleep)
. Вы хотите что-то вроде:
std::chrono::duration<double>(timeToSleep)
если timeToSleep
не измеряется в секундах, вы можете передать отношение в качестве параметра шаблона к duration
. См.здесь (и примеры есть) для получения дополнительной информации.
const unsigned long timeToSleep = static_cast<unsigned long>( GetTimeToSleep() * 1000 );
std::this_thread::sleep_for(std::chrono::milliseconds(timeToSleep));
сделав ответ из @Cornstalks немного более общим, вы можете определить такую функцию:
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));