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(); // floating-point duration: no duration_cast needed const std::chrono::duration<double, std::milli> fp_ms = t2 - t1; // integral duration: requires duration_cast const auto int_ms = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1); // converting integral duration to integral duration of // shorter divisible time unit: no duration_cast needed const std::chrono::duration<long, std::micro> int_usec = int_ms; std::cout << "f() took " << fp_ms << ", or " << int_ms << " (whole milliseconds), or " << int_usec << " (whole microseconds)\n"; }
可能的输出
f() took 1000.14ms, or 1000ms (whole milliseconds), or 1000000us (whole microseconds)
[编辑] 另请参阅
(C++11) |
时间间隔 (类模板) |
(C++11) |
将一个时间点转换为同一时钟上的另一个时间点,但具有不同的持续时间 (函数模板) |
(C++17) |
将持续时间转换为另一个持续时间,向下取整 (函数模板) |
(C++17) |
将持续时间转换为另一个持续时间,向上取整 (函数模板) |
(C++17) |
将持续时间转换为另一个持续时间,四舍五入,舍入到最接近的偶数 (函数模板) |