преобразовать секунды как 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));

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