std::chrono::duration_cast

来自cppreference.com
< cpp‎ | chrono‎ | duration
 
 
工具库
语言支持
类型支持(基本类型、RTTI)
库功能特性测试宏 (C++20)
动态内存管理
程序工具
协程支持 (C++20)
变参数函数
调试支持
(C++26)
三路比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
初等字符串转换
(C++17)
(C++17)

 
 
 
在标头 <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 的时长。

只有 ToDurationstd::chrono::duration 的特化的情况下,此函数才会参与重载决议。

  • ToReptypename ToDuration::rep
  • ToPeriodtypename ToDuration::period
  • CFstd::ratio_divide<Period, ToPeriod>
  • CRstd::common_type<Rep, ToRep, std::intmax_t>::type
  • cr_countstatic_cast<CR>(d.count())
  • cr_numstatic_cast<CR>(CF::num),以及
  • cr_denstatic_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)
时间区间
(类模板)
转换时间点为同一时钟上拥有不同时长的另一时间点
(函数模板)
以向下取整的方式,将一个时长转换为另一个时长
(函数模板)
以向上取整的方式,将一个时长转换为另一个时长
(函数模板)
转换时长到另一个时长,就近取整,偶数优先
(函数模板)