std::chrono::duration_cast
提供: cppreference.com
template<class ToDuration, class Rep, class Period> constexpr ToDuration duration_cast(const duration<Rep,Period>& d); | (C++11以上) | |
std::chrono::duration を異なる型 ToDuration
の duration に変換します。
暗黙の変換は使用されません。 引数のいずれかが 1 であることがコンパイル時に判明すれば、乗算や除算は可能な限り回避されます。 計算は利用可能な最も広い幅で行われ、最後に結果の型に (static_cast で行われたかのように) 変換されます。
目次 |
[編集]引数
d | - | 変換する duration |
[編集]戻り値
ToDuration
型の duration に変換された d
。
[編集]ノート
この関数は、 ToDuration
が std::chrono::duration の特殊化でなければ、オーバーロード解決に参加しません。
変換元の刻み幅が変換後の刻み幅で割り切れる場合 (hours からminutes など) の整数の duration 間のキャストや、浮動小数点の duration 間のキャストは、通常のキャストや std::chrono::duration のコンストラクタによる暗黙の変換で行うことができ、 duration_cast は必要ありません。
浮動小数点の duration から整数の duration へのキャストは、その浮動小数点値が NaN、無限大、または変換後の整数型で表現できないほど大きい場合、未定義動作の対象です。 そうでなければ、整数の duration へのキャストは、整数型への static_cast の場合と同様に、切り捨てが行われます。
[編集]例
この例は関数の実行時間を計測します。
Run this code
#include <iostream>#include <chrono>#include <ratio>#include <thread> void f(){std::this_thread::sleep_for(std::chrono::seconds(1));} int main(){auto t1 = std::chrono::high_resolution_clock::now(); f();auto t2 = std::chrono::high_resolution_clock::now(); // 浮動小数点の duration。 duration_cast は必要ありません。std::chrono::duration<double, std::milli> fp_ms = t2 - t1; // 整数の duration。 duration_cast が必要です。auto int_ms = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1); // 整数の duration から、より短い割り切れる時間単位の整数の duration への変換。// duration_cast は必要ありません。std::chrono::duration<long, std::micro> int_usec = int_ms; std::cout<<"f() took "<< fp_ms.count()<<" ms, "<<"or "<< int_ms.count()<<" whole milliseconds "<<"(which is "<< int_usec.count()<<" whole microseconds)"<<std::endl;}
出力例:
f() took 1000.23 ms, or 1000 whole milliseconds (which is 1000000 whole microseconds)
[編集]関連項目
(C++11) | 時の間隔 (クラステンプレート) |
time point を同じ時計の異なる時間単位の time point に変換します (関数テンプレート) | |
(C++17) | 時間を別の時間に切り捨て変換します (関数テンプレート) |
(C++17) | 時間を別の時間に切り上げ変換します (関数テンプレート) |
(C++17) | 時間を別の時間の最も近い値に丸めて変換します (関数テンプレート) |