名前空間
変種
操作

std::chrono::duration_cast

From cppreference.com
< cpp‎ | chrono‎ | duration
 
 
 
 
ヘッダー <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 に変換します。

この関数は、ToDurationstd::chrono::duration の特殊化である場合にのみ、オーバーロード解決に参加します。

以下とする:

  • ToReptypename ToDuration::rep
  • ToPeriodtypename ToDuration::period
  • CFstd::ratio_divide<Period, ToPeriod>
  • CRstd::common_type<Rep, ToRep, std::intmax_t>::type
  • cr_countstatic_cast<CR>(d.count())
  • cr_numstatic_cast<CR>(CF::num)、そして
  • cr_denstatic_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。

[編集] 戻り値

dToDuration 型の 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)
時間の間隔
(クラステンプレート) [編集]
時間点を、同じクロック上の異なる期間を持つ別の時間点に変換する
(関数テンプレート) [edit]
期間を別の期間に変換し、切り捨てる
(関数テンプレート) [edit]
期間を別の期間に変換し、切り上げる
(関数テンプレート) [edit]
期間を別の期間に変換し、最も近い値に丸め、等距離の場合は偶数に丸める
(関数テンプレート) [edit]
English 日本語 中文(简体) 中文(繁體)