定义于头文件 <chrono>
template< class Rep, class Period = std::ratio<1> > class duration;
类模板 std::chrono::duration 表示时间间隔。
它由 Rep 类型的计次数和计次周期组成,其中计次周期是一个编译期有理数常量,表示从一个计次到下一个的秒数。
存储于 duration 的数据仅有 Rep 类型的计次数。若 Rep 是浮点数,则 duration 能表示小数的计次数。 Period 被包含为时长类型的一部分,且只在不同时长间转换时使用。
比较两个时长
operator==,!=,<,<=,>,>=(std::chrono::duration)
template <class Rep1, class Period1, class Rep2, class Period2> constexpr bool operator==(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); | (1) | |
template <class Rep1, class Period1, class Rep2, class Period2> constexpr bool operator!=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); | (2) | |
template <class Rep1, class Period1, class Rep2, class Period2> constexpr bool operator<(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); | (3) | |
template <class Rep1, class Period1, class Rep2, class Period2> constexpr bool operator<=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); | (4) | |
template <class Rep1, class Period1, class Rep2, class Period2> constexpr bool operator>(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); | (5) | |
template <class Rep1, class Period1, class Rep2, class Period2> constexpr bool operator>=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); | (6) |
比较二个时长。
1-2) 检查 lhs
与 rhs
是否相等,即以两个 duration 的共用类型表示的计次数是否相等。
3-6) 比较 lhs
与 rhs
,即比较两个 duration 的共用类型表示的计次数。
参数
lhs | - | 运算符左侧的 duration |
rhs | - | 运算符右侧的 duration |
返回值
假设 CT =
std::common_type<std::chrono::duration<Rep1, Period1>,
std::chrono::duration<Rep2, Period2>>::type ,则为:
1) CT(lhs).count() == CT(rhs).count()
2) !(lhs == rhs)
3) CT(lhs).count() < CT(rhs).count()
4) !(rhs < lhs)
5) rhs < lhs
6) !(lhs < rhs)
调用示例
#include <chrono>
#include <iostream>
int main()
{
if (std::chrono::seconds(2) == std::chrono::milliseconds(2000))
{
std::cout << "2 s == 2000 ms\n";
}
else
{
std::cout << "2 s != 2000 ms\n";
}
if (std::chrono::seconds(61) > std::chrono::minutes(1))
{
std::cout << "61 s > 1 min\n";
}
else
{
std::cout << "61 s <= 1 min\n";
}
}
转换时长到另一个拥有不同嘀嗒间隔的时长
std::chrono::duration_cast
template <class ToDuration, class Rep, class Period> | (C++11 起) |
转换 std::chrono::duration 为不同类型 ToDuration
的时长。
不使用隐式转换。可能的情况下避免乘法和除法,若在编译时已知一或多个参数为 1 。以最宽的可用类型进行计算,而如同用 static_cast 到结果类型的转换,只在完成时进行。
参数
d | - | 要转换的 duration |
返回值
转换为 ToDuration
类型时长的 d
。
注意
函数不参与重载决议,除非 ToDuration
是 std::chrono::duration 的实例。
在源周期能准确地为目标周期所整除的场合(例如小时到分钟),浮点时长和整数时长间转型能隐式进行,无需 duration_cast 。
从浮点时长转型到整数时长,在浮点值为 NaN 、无穷大或过大而无法以目标的整数类型表示时,导致未定义行为。
调用示例
#include <iostream>
#include <chrono>
#include <ratio>
#include <thread>
void f()
{
std::this_thread::sleep_for(std::chrono::seconds(1));
}
int main()
{
auto t1 = std::chrono::high_resolution_clock::now();
f();
auto t2 = std::chrono::high_resolution_clock::now();
// 整数时长:要求 duration_cast
auto int_ms = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1);
// 小数时长:不要求 duration_cast
std::chrono::duration<double, std::milli> fp_ms = t2 - t1;
std::cout << "f() took " << fp_ms.count() << " ms, "
<< "or " << int_ms.count() << " whole milliseconds\n";
}