c++11 日期和时间工具(std::chrono::duration)(三)

定义于头文件 <chrono>

 

template< class Rep, class Period = std::ratio<1> > class duration;

类模板 std::chrono::duration 表示时间间隔。

它由 Rep 类型的计次数和计次周期组成,其中计次周期是一个编译期有理数常量,表示从一个计次到下一个的秒数。

存储于 duration 的数据仅有 Rep 类型的计次数。若 Rep 是浮点数,则 duration 能表示小数的计次数。 Period 被包含为时长类型的一部分,且只在不同时长间转换时使用。
 

特化 std::common_type 特征

std::common_type(std::chrono::duration)
template <class Rep1, class Period1, class Rep2, class Period2>
struct common_type<std::chrono::duration<Rep1, Period1>,
std::chrono::duration<Rep2, Period2>> {
typedef std::chrono::duration<
typename std::common_type<Rep1, Rep2>::type, /*see note*/> type;};

暴露名为 type 的类型,它是二个 std::chrono::duration 的共用类型。

注意

结果 duration 的周期是 Period1Period2 的最大公约数。

调用示例

#include <iostream>
#include <chrono>

// std::chrono 已找到最大公约数,类似使用 std::common_type<> 。
// 我们令类型推导外化。

template <typename T, typename S>
auto durationDiff(const T& t, const S& s)  -> typename std::common_type<T, S>::type
{
    typedef typename std::common_type<T, S>::type Common;
    return Common(t) - Common(s);
}


int main()
{
    typedef std::chrono::milliseconds milliseconds;
    typedef std::chrono::microseconds microseconds;

    auto ms = milliseconds(30);
    auto us = microseconds(1100);

    std::cout << ms.count() << "ms - " << us.count() << "us = "
              << durationDiff(ms, us).count() <<  "\n";
}

实现以时长为实参的算术运算

operator+,-,*,/,%(std::chrono::duration)
template< class Rep1, class Period1, class Rep2, class Period2 >

typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type
    constexpr operator+( const duration<Rep1,Period1>& lhs,

                         const duration<Rep2,Period2>& rhs );
(1)
template< class Rep1, class Period1, class Rep2, class Period2 >

typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type
    constexpr operator-( const duration<Rep1,Period1>& lhs,

                         const duration<Rep2,Period2>& rhs );
(2)
template< class Rep1, class Period, class Rep2 >

duration<typename std::common_type<Rep1,Rep2>::type, Period>
    constexpr operator*( const duration<Rep1,Period>& d,

                         const Rep2& s );
(3)
template< class Rep1, class Rep2, class Period >

duration<typename std::common_type<Rep1,Rep2>::type, Period>
    constexpr operator*( const Rep1& s,

                         const duration<Rep2,Period>& d );
(4)
template< class Rep1, class Period, class Rep2 >

duration<typename std::common_type<Rep1,Rep2>::type, Period>
    constexpr operator/( const duration<Rep1,Period>& d,

                         const Rep2& s );
(5)
template< class Rep1, class Period1, class Rep2, class Period2 >

typename std::common_type<Rep1,Rep2>::type
    constexpr operator/( const duration<Rep1,Period1>& lhs,

                         const duration<Rep2,Period2>& rhs );
(6)
template< class Rep1, class Period, class Rep2 >

duration<typename std::common_type<Rep1,Rep2>::type, Period>
    constexpr operator%( const duration<Rep1, Period>& d,

                         const Rep2& s );
(7)
template< class Rep1, class Period1, class Rep2, class Period2 >

typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type
constexpr operator%( const duration<Rep1,Period1>& lhs,

                     const duration<Rep2,Period2>& rhs );
(8)

在二个 duration 或 duration 和计次数之间进行基本算术运算。

1) 转换二个 duration 为其共用类型,并创建计次数为转换后计次数之和的 duration 。

2) 转换二个 duration 为其共用类型,并创建计次数为转换后从 lhs 的计次数减去 rhs 的计次数的 duration 。

3-4) 转换 duration d 到其 repRep1Rep2 之间的共用类型的 duration ,并将转换后的计次数乘 s

5) 转换 duration d 到其 repRep1Rep2 之间的共用类型的 duration ,并将转换后的计次数除以 s

6) 转换二个 duration 为其共用类型,并将 lhs 转换后的计次数除以 rhs 转换后的计次数。注意此运算符的返回值不是 duration 。

7) 转换转换 duration d 到其 repRep1Rep2 之间的共用类型的 duration ,并创建计次数为此时长的计次数除以 s 的 duration 。

8) 转换二个 duration 为其共用类型,并创建计次数为转换后计次数取余的 duration 。

本节未完成
原因:列出“不参与重载决议,除非”的制约

参数

lhs-运算符左侧的 duration
rhs-运算符右侧的 duration
d-混合参数运算符的时长参数
s-混合参数运算符的计次参数

返回值

假设 CD 为函数返回类型且 CR<A, B> = std::common_type<A, B>::type ,则:

1) CD(CD(lhs).count() + CD(rhs).count())

2) CD(CD(lhs).count() - CD(rhs).count())

3-4) CD(CD(d).count() * s)

5) CD(CD(d).count() / s).

6) CD(lhs).count() / CD(rhs).count() (此运算符的返回类型非 duration )

7) CD(CD(d).count() % s)

8) CD(CD(lhs).count() % CD(rhs).count())

 调用示例

#include <chrono>
#include <iostream>
int main()
{
    // 简单算术
    std::chrono::seconds s = std::chrono::hours(1)
                             + 2 * std::chrono::minutes(10)
                             + std::chrono::seconds(70) / 10;

    std::cout << "1 hour + 2*10 min + 70/10 sec = " << s.count() << " seconds\n";

    // 时长除以一个数和时长除以另一时长的区别
    std::cout << "Dividing that by 2 minutes gives "
              << s / std::chrono::minutes(2) << '\n';
    std::cout << "Dividing that by 2 gives "
              << (s / 2).count() << " seconds\n";

    // 余数运算符在确定此特定时长在时间框架的场合有用,
    // 例如,拆分它为时、分和秒:
    std::cout << s.count() << " seconds is "
              << std::chrono::duration_cast<std::chrono::hours>(
                  s
              ).count() << " hours, "
              << std::chrono::duration_cast<std::chrono::minutes>(
                  s % std::chrono::hours(1)
              ).count() << " minutes, "
              << std::chrono::duration_cast<std::chrono::seconds>(
                  s % std::chrono::minutes(1)
              ).count() << " seconds\n";
}

输出

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值