std::chrono::duration_cast
From cppreference.com
| ヘッダー <chrono> で定義 |
||
| template< class ToDuration, class Rep, class Period > constexpr ToDuration duration_cast( const std::chrono::duration<Rep, Period>& d ); |
(C++11以降) | |
std::chrono::duration を別の型 ToDuration の duration に変換します。
この関数は、ToDuration が std::chrono::duration の特殊化である場合にのみ、オーバーロード解決に参加します。
以下とする:
-
ToRepは typename ToDuration::rep、 -
ToPeriodは typename ToDuration::period、 -
CFは std::ratio_divide<Period, ToPeriod>、 -
CRは std::common_type<Rep, ToRep, std::intmax_t>::type、 - cr_count は static_cast<CR>(d.count())、
- cr_num は static_cast<CR>(CF::num)、そして
- cr_den は static_cast<CR>(CF::den)、
である場合、結果は
| CF::num | |||
|---|---|---|---|
| 1 | ではなく 1 | ||
| CF::den | 1 | ToDuration(static_cast<ToRep> (d.count())) |
ToDuration(static_cast<ToRep> (cr_count * cr_num)) |
| ではなく 1 | ToDuration(static_cast<ToRep> (cr_count / cr_den)) |
ToDuration(static_cast<ToRep> (cr_count * cr_num / cr_den)) | |
目次 |
[編集] パラメータ
| d | - | 変換する duration。 |
[編集] 戻り値
d を ToDuration 型の duration に変換したもの。
[編集] 注記
暗黙の型変換は使用されません。乗算と除算は、コンパイル時に1つ以上のパラメータが 1 であることがわかっている場合、可能な限り回避されます。計算は、利用可能な最も広い型で行われ、結果の型への static_cast と同様に、完了時にのみ変換されます。
整数 duration 間での、ソース期間がターゲット期間で正確に割り切れる場合(例:時間から分へ)のキャスト、または浮動小数点数 duration 間のキャストは、通常のキャストまたは std::chrono::duration のコンストラクタを介した暗黙の変換で実行できます。この場合、duration_cast は必要ありません。
浮動小数点数 duration から整数 duration へのキャストは、浮動小数点数の値が NaN、無限大、またはターゲットの整数型で表現できないほど大きい場合、未定義の動作の対象となります。それ以外の場合、整数 duration へのキャストは、整数型への任意の static_cast と同様に切り捨ての対象となります。
[編集] 例
この例では、関数の実行時間を測定します。
このコードを実行
#include <chrono> #include <iostream> #include <ratio> #include <thread> void f() { std::this_thread::sleep_for(std::chrono::seconds(1)); } int main() { const auto t1 = std::chrono::high_resolution_clock::now(); f(); const auto t2 = std::chrono::high_resolution_clock::now(); // floating-point duration: no duration_cast needed const std::chrono::duration<double, std::milli> fp_ms = t2 - t1; // integral duration: requires duration_cast const auto int_ms = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1); // converting integral duration to integral duration of // shorter divisible time unit: no duration_cast needed const std::chrono::duration<long, std::micro> int_usec = int_ms; std::cout << "f() took " << fp_ms << ", or " << int_ms << " (whole milliseconds), or " << int_usec << " (whole microseconds)\n"; }
実行結果の例
f() took 1000.14ms, or 1000ms (whole milliseconds), or 1000000us (whole microseconds)
[編集] 関連項目
| (C++11) |
時間の間隔 (クラステンプレート) |
| (C++11) |
時間点を、同じクロック上の異なる期間を持つ別の時間点に変換する (関数テンプレート) |
| (C++17) |
期間を別の期間に変換し、切り捨てる (関数テンプレート) |
| (C++17) |
期間を別の期間に変換し、切り上げる (関数テンプレート) |
| (C++17) |
期間を別の期間に変換し、最も近い値に丸め、等距離の場合は偶数に丸める (関数テンプレート) |