std::chrono::duration_cast
来自cppreference.com
| 在标头 <chrono> 定义
|
||
| |
(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) |
转换时长到另一个时长,就近取整,偶数优先 (函数模板) |