<chrono> では、経過時間を表すクラスである duration が提供されます。
namespace std { namespace chrono { template <class Rep, class Period = ratio<1>> class duration { public: typedef Rep rep; typedef Period period; private: rep rep_; // 説明のために記述されてるだけ public: duration() = default; template <class Rep2> explicit duration(const Rep2& r); template <class Rep2, class Period2> duration(const duration<Rep2, Period2>& d); ~duration() = default; duration(const duration&) = default; duration& operator=(const duration&) = default; rep count() const; duration operator+() const; duration operator-() const; duration& operator++(); duration operator++(int); duration& operator--(); duration operator--(int); duration& operator+=(const duration& d); duration& operator-=(const duration& d); duration& operator*=(const rep& rhs); duration& operator/=(const rep& rhs); static constexpr duration zero(); static constexpr duration min(); static constexpr duration max(); }; template <class Rep1, class Period1, class Rep2, class Period2> bool operator==(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); template <class Rep1, class Period1, class Rep2, class Period2> bool operator!=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); template <class Rep1, class Period1, class Rep2, class Period2> bool operator< (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); template <class Rep1, class Period1, class Rep2, class Period2> bool operator<=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); template <class Rep1, class Period1, class Rep2, class Period2> bool operator> (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); template <class Rep1, class Period1, class Rep2, class Period2> bool operator>=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); template <class ToDuration, class Rep, class Period> ToDuration duration_cast(const duration<Rep, Period>& d); } }
duration は、以下の 6 つの単位時間を表す typedef を提供します。
typedef duration<signed integral type of at least 64 bits, nano> nanoseconds; typedef duration<signed integral type of at least 55 bits, micro> microseconds; typedef duration<signed integral type of at least 45 bits, milli> milliseconds; typedef duration<signed integral type of at least 35 bits > seconds; typedef duration<signed integral type of at least 29 bits, ratio< 60>> minutes; typedef duration<signed integral type of at least 23 bits, ratio<3600>> hours;
(nano, micro, milli は
minutes(3) のようにコンストラクタに値を渡して時間を表します。
minutes m1(3); // 3分 minutes m2(2); // 2分 minutes m3 = m1 + m2; // 5分 microseconds us1(3); // 3マイクロ秒 microseconds us2(2); // 2マイクロ秒 microseconds us3 = us1 + us2; // 5マイクロ秒 microseconds us4 = m3 + us3; // 300000005マイクロ秒...分からマイクロ秒への暗黙の変換がかかる
duration に格納されている時間を取得するには count() を使用します。
long long tc = uc4.count(); // 300000005
ただし、このコードはコンパイルエラーになります。
minutes m4 = m3 + us3;
暗黙の切り捨てによって誤差が生じるのはよくないからです。
どうしても同じことをやりたい場合は、明示的な変換をする必要があります。
minutes m4 = duration_cast<minutes>(m3 + us3); // m4.count() == 5