operator+,-,*,/,%(std::chrono::duration)

来自cppreference.com
< cpp‎ | chrono‎ | duration
 
 
工具库
类型支持(基本类型、 RTTI 、类型特性)
动态内存管理
错误处理
程序工具
变参数函数
日期和时间
函数对象
(C++11)
关系运算符
optionalanyvariant (C++17)
pair 与 tuple
(C++11)
(C++17)
swap 、 forward 与 move
(C++14)
(C++11)
(C++11)
初等字符串转换
(C++17)
(C++17)
类型运算
(C++11)
(C++17)
 
 
 
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 hour + 2*10 min + 70/10 sec = 4807 seconds
Dividing that by 2 minutes gives 40
Dividing that by 2 gives 2403 seconds
4807 seconds is 1 hours, 20 minutes, 7 seconds