web-dev-qa-db-ja.com

秒を標準としてstd :: chrono :: durationに変換しますか?

私は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

<chrono>参照でロックしましたが、やや混乱しています。

ありがとう

編集:

以下はエラーになります:

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

エラー:

c:\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
28
KaiserJohaan

std::chrono::seconds(timeToSleep)を実行しないでください。次のようなものが必要です:

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

または、timeToSleepが秒単位で測定されない場合は、比率をテンプレートパラメータとしてdurationに渡すことができます。詳細は here (およびその例)を参照してください。

23
Cornstalks

@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));
5
const unsigned long timeToSleep = static_cast<unsigned long>( GetTimeToSleep() * 1000 );
std::this_thread::sleep_for(std::chrono::milliseconds(timeToSleep));
4
slaterade
std::chrono::milliseconds duration(timeToSleep);
std::this_thread::sleep_for( duration );
0
P0W