std::chrono::duration
| ヘッダー <chrono> で定義 |
||
| template< class Rep, |
(C++11以降) | |
クラステンプレートstd::chrono::durationは時間間隔を表します。
これは、Rep型のティックカウントとティック周期で構成され、ティック周期は、1つのティックから次のティックまでの時間を秒単位で表すコンパイル時の有理分数です。
durationに格納される唯一のデータは、Rep型のティックカウントです。Repが浮動小数点型の場合、durationはティックの分数も表現できます。Periodはdurationの型の一部として含まれ、異なるduration間で変換する場合にのみ使用されます。
目次 |
[編集] メンバー型
| メンバ型 | 定義 |
rep
|
ティック数を表す算術型、または算術型をエミュレートするクラスであるRep |
period
|
Period(C++17まで)typename Period::type(C++17以降)、ティック周期(つまり、1ティックあたりの秒の分数)を表すstd::ratio |
[編集] メンバー関数
| 新しいdurationを構築する (publicメンバー関数) | |
| 内容を代入する (publicメンバー関数) | |
| ティック数を返す (publicメンバー関数) | |
| [static] |
特別なduration値ゼロを返す (public staticメンバー関数) |
| [static] |
特別なduration値minを返す (public staticメンバー関数) |
| [static] |
特別なduration値maxを返す (public staticメンバー関数) |
| 単項+および単項-を実装 (publicメンバー関数) | |
| ティック数を増減する (publicメンバー関数) | |
| 2つのduration間の複合代入を実装する (publicメンバー関数) |
[編集] 非メンバー関数
| 期間を引数とする算術演算を実装 (関数テンプレート) | |
| (C++11)(C++11)(C++20で削除)(C++11)(C++11)(C++11)(C++11)(C++20) |
2つの期間を比較する (関数テンプレート) |
| (C++11) |
期間を異なる刻み間隔を持つ別の期間に変換する (関数テンプレート) |
| (C++17) |
期間を別の期間に変換し、切り捨てる (関数テンプレート) |
| (C++17) |
期間を別の期間に変換し、切り上げる (関数テンプレート) |
| (C++17) |
期間を別の期間に変換し、最も近い値に丸め、等距離の場合は偶数に丸める (関数テンプレート) |
| (C++17) |
durationの絶対値を取得する (関数テンプレート) |
| (C++20) |
durationにストリーム出力を行う(関数テンプレート) |
| (C++20) |
指定された形式に従ってストリームからdurationをパースする(関数テンプレート) |
[編集] ヘルパー型
以下の表で使用されている型/* intXX */は、少なくともXXビットの符号付き整数型を意味します。
| 型 | 定義 |
std::chrono::nanoseconds
|
std::chrono::duration</* int64 */, std::nano> |
std::chrono::microseconds
|
std::chrono::duration</* int55 */, std::micro> |
std::chrono::milliseconds
|
std::chrono::duration</* int45 */, std::milli> |
std::chrono::seconds
|
std::chrono::duration</* int35 */> |
std::chrono::minutes
|
std::chrono::duration</* int29 */, std::ratio<60>> |
std::chrono::hours
|
std::chrono::duration</* int23 */, std::ratio<3600>> |
std::chrono::days (C++20以降) |
std::chrono::duration</* int25 */, std::ratio<86400>> |
std::chrono::weeks (C++20以降) |
std::chrono::duration</* int22 */, std::ratio<604800>> |
std::chrono::months (C++20以降) |
std::chrono::duration</* int20 */, std::ratio<2629746>> |
std::chrono::years (C++20以降) |
std::chrono::duration</* int17 */, std::ratio<31556952>> |
注: 定義済みのhoursまでの各期間型は、少なくとも±292年の範囲をカバーします。
|
定義済みのduration型 |
(C++20以降) |
[編集] ヘルパークラス
| std::common_type 特性を特殊化する (クラス テンプレートの特殊化) | |
| (C++11) |
期間が異なるティック周期の期間に変換可能であることを示す (クラステンプレート) |
| (C++11) |
指定された型のティックカウントのゼロ、最小値、最大値を構築する (クラステンプレート) |
duration の書式設定サポート(クラス テンプレートの特殊化) | |
| std::chrono::durationのハッシュをサポートする (クラステンプレートの特殊化) |
[編集] ヘルパー特殊化
| template< class Rep, class Period > constexpr bool enable_nonlocking_formatter_optimization<chrono::duration<Rep, Period>> |
(C++23から) | |
std::enable_nonlocking_formatter_optimizationのこの特殊化は、テンプレートパラメータRepがそれを有効にする場合に、chrono::durationオブジェクトを出力するためのstd::printおよびstd::printlnの効率的な実装を可能にします。
[編集] リテラル
| インライン名前空間
std::literals::chrono_literals で定義 | |
| (C++14) |
時間数を表すstd::chrono::durationリテラル (関数) |
| (C++14) |
分数を表すstd::chrono::durationリテラル (関数) |
| (C++14) |
秒数を表すstd::chrono::durationリテラル (関数) |
| (C++14) |
ミリ秒数を表すstd::chrono::durationリテラル (関数) |
| (C++14) |
マイクロ秒数を表すstd::chrono::durationリテラル (関数) |
| (C++14) |
ナノ秒数を表すstd::chrono::durationリテラル (関数) |
| (C++20以降) |
[編集] 注釈
durationオブジェクトdが保持する実際の時間間隔(秒単位)は、およそd.count() * D::period::num / D::period::denに等しく、ここでDはchrono::duration<>型であり、dはそのような型のオブジェクトです。
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_chrono_udls |
201304L |
(C++14) | 時間型のためのユーザー定義リテラル |
[編集] 例
この例は、いくつかのカスタム期間型を定義し、型間で変換する方法を示します。
#include <chrono> #include <iostream> using namespace std::chrono_literals; template<typename T1, typename T2> using mul = std::ratio_multiply<T1, T2>; int main() { using microfortnights = std::chrono::duration<float, mul<mul<std::ratio<2>, std::chrono::weeks::period>, std::micro>>; using nanocenturies = std::chrono::duration<float, mul<mul<std::hecto, std::chrono::years::period>, std::nano>>; using fps_24 = std::chrono::duration<double, std::ratio<1, 24>>; std::cout << "1 second is:\n"; // integer scale conversion with no precision loss: no cast std::cout << std::chrono::milliseconds(1s).count() << " milliseconds\n" << std::chrono::microseconds(1s).count() << " microseconds\n" << std::chrono::nanoseconds(1s).count() << " nanoseconds\n"; // integer scale conversion with precision loss: requires a cast std::cout << std::chrono::duration_cast<std::chrono::minutes>(1s).count() << " minutes\n"; // alternative to duration_cast: std::cout << 1s / 1min << " minutes\n"; // floating-point scale conversion: no cast std::cout << microfortnights(1s).count() << " microfortnights\n" << nanocenturies(1s).count() << " nanocenturies\n" << fps_24(1s).count() << " frames at 24fps\n"; }
出力
1 second is: 1000 milliseconds 1000000 microseconds 1000000000 nanoseconds 0 minutes 0 minutes 0.82672 microfortnights 0.316887 nanocenturies 24 frames at 24fps