std::chrono::duration
定义在头文件 <chrono> 中 |
||
template< class Rep, |
(自 C++11 起) | |
类模板 std::chrono::duration
代表一个时间间隔。
它包含一个类型为 Rep
的刻度计数和一个刻度周期,其中刻度周期是一个编译时有理数 分数,代表从一个刻度到下一个刻度的时间(以秒为单位)。
duration
中存储的唯一数据是一个类型为 Rep
的刻度计数。如果 Rep
是浮点数,则 duration
可以代表刻度的分数。Period
被包含为 duration
类型的一部分,并且仅在不同 duration
之间进行转换时使用。
内容 |
[编辑] 成员类型
成员类型 | 定义 |
rep
|
Rep ,一个算术类型,或一个模拟算术类型的类,代表刻度数量 |
period
|
Period (直到 C++17)typename Period::type(自 C++17 起), 一个 std::ratio,代表刻度周期(即每个刻度的秒分数) |
[编辑] 成员函数
构造新的持续时间 (公共成员函数) | |
分配内容 (公共成员函数) | |
返回刻度计数 (公共成员函数) | |
[静态] |
返回特殊的持续时间值零 (公共静态成员函数) |
[静态] |
返回特殊的持续时间值 min (公共静态成员函数) |
[静态] |
返回特殊的持续时间值 max (公共静态成员函数) |
实现一元 + 和一元 - (公共成员函数) | |
增加或减少滴答计数 (公共成员函数) | |
实现两个持续时间之间的复合赋值 (公共成员函数) |
[edit] 非成员函数
实现以持续时间作为参数的算术运算 (函数模板) | |
(C++11)(C++11)(C++20 中移除)(C++11)(C++11)(C++11)(C++11)(C++20) |
比较两个持续时间 (函数模板) |
(C++11) |
将持续时间转换为另一个持续时间,具有不同的滴答间隔 (函数模板) |
(C++17) |
将持续时间转换为另一个持续时间,向下舍入 (函数模板) |
(C++17) |
将持续时间转换为另一个持续时间,向上舍入 (函数模板) |
(C++17) |
将持续时间转换为另一个持续时间,舍入到最接近的值,将平局舍入到偶数 (函数模板) |
(C++17) |
获取持续时间的绝对值 (函数模板) |
(C++20) |
对 duration 执行流输出(函数模板) |
(C++20) |
根据提供的格式从流中解析 duration (函数模板) |
[edit] 辅助类型
类型 /* intXX */ 在下面的表格中表示至少 XX 位的带符号整数类型。
类型 | 定义 |
std::chrono::nanoseconds
|
std::chrono::duration</* int64 */, std::nano> |
std::chrono::microseconds
|
std::chrono::duration</* int55 */, std::micro> |
std::chrono::milliseconds
|
std::chrono::duration</* int45 */, std::milli> |
std::chrono::seconds
|
std::chrono::duration</* int35 */> |
std::chrono::minutes
|
std::chrono::duration</* int29 */, std::ratio<60>> |
std::chrono::hours
|
std::chrono::duration</* int23 */, std::ratio<3600>> |
std::chrono::days (自 C++20 起) |
std::chrono::duration</* int25 */, std::ratio<86400>> |
std::chrono::weeks (自 C++20 起) |
std::chrono::duration</* int22 */, std::ratio<604800>> |
std::chrono::months (自 C++20 起) |
std::chrono::duration</* int20 */, std::ratio<2629746>> |
std::chrono::years (自 C++20 起) |
std::chrono::duration</* int17 */, std::ratio<31556952>> |
注意:每个预定义的持续时间类型(直到 hours
)涵盖的范围至少为 ±292 年。
每个预定义的持续时间类型 |
(自 C++20 起) |
[edit] 辅助类
专门化 std::common_type 特性 (类模板专门化) | |
(C++11) |
指示持续时间可以转换为具有不同滴答周期的持续时间 (类模板) |
(C++11) |
构造给定类型的滴答计数的零、最小值和最大值 (类模板) |
duration 的格式化支持(类模板专门化) | |
std::chrono::duration 的哈希支持 (类模板专门化) |
[edit] 辅助专门化
template< class Rep, class Period > constexpr bool enable_nonlocking_formatter_optimization<chrono::duration<Rep, Period>> |
(自 C++23 起) | |
此 std::enable_nonlocking_formatter_optimization 的专门化在模板参数 Rep
启用时,为打印 chrono::duration
对象有效地实现 std::print 和 std::println 提供了支持。
[edit] 字面量
在内联命名空间
std::literals::chrono_literals 中定义 | |
(C++14) |
一个表示小时的 std::chrono::duration 字面量 (函数) |
(C++14) |
一个表示分钟的 std::chrono::duration 字面量 (函数) |
(C++14) |
一个表示秒的 std::chrono::duration 字面量 (函数) |
(C++14) |
一个表示毫秒的 std::chrono::duration 字面量 (函数) |
(C++14) |
一个表示微秒的 std::chrono::duration 字面量 (函数) |
(C++14) |
一个表示纳秒的 std::chrono::duration 字面量 (函数) |
(自 C++20 起) |
[edit] 注释
持续时间对象d 所持有的实际时间间隔(以秒为单位)大约等于 d.count() * D::period::num / D::period::den,其中 D
是 chrono::duration<>
类型,d 是这种类型的对象。
特性测试 宏 | 值 | 标准 | 特性 |
---|---|---|---|
__cpp_lib_chrono_udls |
201304L | (C++14) | 时间类型的用户定义字面量 |
[编辑] 示例
此示例展示了如何定义几种自定义持续时间类型以及如何在类型之间进行转换。
#include <chrono> #include <iostream> using namespace std::chrono_literals; template<typename T1, typename T2> using mul = std::ratio_multiply<T1, T2>; int main() { using microfortnights = std::chrono::duration<float, mul<mul<std::ratio<2>, std::chrono::weeks::period>, std::micro>>; using nanocenturies = std::chrono::duration<float, mul<mul<std::hecto, std::chrono::years::period>, std::nano>>; using fps_24 = std::chrono::duration<double, std::ratio<1, 24>>; std::cout << "1 second is:\n"; // integer scale conversion with no precision loss: no cast std::cout << std::chrono::milliseconds(1s).count() << " milliseconds\n" << std::chrono::microseconds(1s).count() << " microseconds\n" << std::chrono::nanoseconds(1s).count() << " nanoseconds\n"; // integer scale conversion with precision loss: requires a cast std::cout << std::chrono::duration_cast<std::chrono::minutes>(1s).count() << " minutes\n"; // floating-point scale conversion: no cast std::cout << microfortnights(1s).count() << " microfortnights\n" << nanocenturies(1s).count() << " nanocenturies\n" << fps_24(1s).count() << " frames at 24fps\n"; }
输出
1 second is: 1000 milliseconds 1000000 microseconds 1000000000 nanoseconds 0 minutes 0.82672 microfortnights 0.316887 nanocenturies 24 frames at 24fps