命名空间
变体
操作

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();
 
    // 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)
时间间隔
(类模板) [编辑]
将一个时间点转换为同一时钟上的另一个时间点,但具有不同的持续时间
(函数模板) [编辑]
将持续时间转换为另一个持续时间,向下取整
(函数模板) [编辑]
将持续时间转换为另一个持续时间,向上取整
(函数模板) [编辑]
将持续时间转换为另一个持续时间,四舍五入,舍入到最接近的偶数
(函数模板) [编辑]