読者です 読者をやめる 読者になる 読者になる

C++0x chrono - duration

C++

<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 は で提供されるSI単位を表すtypedef...こちらを参照)


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