std::chrono::duration_cast
来自cppreference.com
在标头 <chrono> 定义
|
||
template< class ToDuration, class Rep, class Period > constexpr ToDuration duration_cast( const std::chrono::duration<Rep, Period>& d ); |
(C++11 起) | |
将 std::chrono::duration 转换成不同类型 ToDuration
的时长。
只有 ToDuration
是 std::chrono::duration 的特化的情况下,此函数才会参与重载决议。
设
-
ToRep
为 typename ToDuration::rep, -
ToPeriod
为 typename ToDuration::period, -
CF
为 std::ratio_divide<Period, ToPeriod>, -
CR
为 std::common_type<Rep, ToRep, std::intmax_t>::type, - cr_count 为 static_cast<CR>(d.count()),
- cr_num 为 static_cast<CR>(CF::num),以及
- cr_den 为 static_cast<CR>(CF::den),
那么结果是:
CF::num | |||
---|---|---|---|
1 | 非 1 | ||
CF::den | 1 | ToDuration(static_cast<ToRep> (d.count())) |
ToDuration(static_cast<ToRep> (cr_count * cr_num)) |
非 1 | ToDuration(static_cast<ToRep> (cr_count / cr_den)) |
ToDuration(static_cast<ToRep> (cr_count * cr_num / cr_den)) |
参数
d | - | 要转换的时长 |
返回值
d 转换成 ToDuration
类型后的时长。
注解
不使用隐式转换。如果在编译时已知一或多个参数为 1,那么就会尽可能避免乘法和除法。以最宽的可用类型进行计算,并如同只在完成时用 static_cast 转换为结果类型。
在源周期能被目标周期精确整除的场合(例如小时到分钟),浮点时长和整数时长间转型能经由 std::chrono::duration
构造函数隐式进行,无需 duration_cast
。
从浮点时长转型到整数时长,在浮点值为 NaN、无穷大或过大而无法以目标的整数类型表示时,导致未定义行为。否则转型到整数时长将进行截断,同任何 static_cast 为整数类型一样。
示例
此示例度量函数的执行时间。
运行此代码
#include <chrono> #include <iostream> #include <ratio> #include <thread> void f() { std::this_thread::sleep_for(std::chrono::seconds(1)); } int main() { const auto t1 = std::chrono::high_resolution_clock::now(); f(); const auto t2 = std::chrono::high_resolution_clock::now(); // 浮点时长:不需要 duration_cast const std::chrono::duration<double, std::milli> fp_ms = t2 - t1; // 整数时长:必须 duration_cast const auto int_ms = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1); // 将整数时长转换为更短可整除的时间单位的整数时长:不需要 duration_cast const std::chrono::duration<long, std::micro> int_usec = int_ms; std::cout << "f() 用了 " << fp_ms << ",或 " << int_ms << "(整毫秒),或" << int_usec << "(整微秒)\n"; }
可能的输出:
f() 用了 1000.14ms,或 1000ms(整毫秒),或 1000000us(整微秒)
参阅
(C++11) |
时间区间 (类模板) |
(C++11) |
转换时间点为同一时钟上拥有不同时长的另一时间点 (函数模板) |
(C++17) |
以向下取整的方式,将一个时长转换为另一个时长 (函数模板) |
(C++17) |
以向上取整的方式,将一个时长转换为另一个时长 (函数模板) |
(C++17) |
转换时长到另一个时长,就近取整,偶数优先 (函数模板) |