定义于头文件 <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 的周期是 Period1
与 Period2
的最大公约数。
调用示例
#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 | (1) | |
template< class Rep1, class Period1, class Rep2, class Period2 > typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type | (2) | |
template< class Rep1, class Period, class Rep2 > duration<typename std::common_type<Rep1,Rep2>::type, Period> | (3) | |
template< class Rep1, class Rep2, class Period > duration<typename std::common_type<Rep1,Rep2>::type, Period> | (4) | |
template< class Rep1, class Period, class Rep2 > duration<typename std::common_type<Rep1,Rep2>::type, Period> | (5) | |
template< class Rep1, class Period1, class Rep2, class Period2 > typename std::common_type<Rep1,Rep2>::type | (6) | |
template< class Rep1, class Period, class Rep2 > duration<typename std::common_type<Rep1,Rep2>::type, Period> | (7) | |
template< class Rep1, class Period1, class Rep2, class Period2 > typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type | (8) |
在二个 duration 或 duration 和计次数之间进行基本算术运算。
1) 转换二个 duration 为其共用类型,并创建计次数为转换后计次数之和的 duration 。
2) 转换二个 duration 为其共用类型,并创建计次数为转换后从 lhs
的计次数减去 rhs
的计次数的 duration 。
3-4) 转换 duration d
到其 rep
为 Rep1
与 Rep2
之间的共用类型的 duration ,并将转换后的计次数乘 s
。
5) 转换 duration d
到其 rep
为 Rep1
与 Rep2
之间的共用类型的 duration ,并将转换后的计次数除以 s
。
6) 转换二个 duration 为其共用类型,并将 lhs
转换后的计次数除以 rhs
转换后的计次数。注意此运算符的返回值不是 duration 。
7) 转换转换 duration d
到其 rep
为 Rep1
与 Rep2
之间的共用类型的 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";
}