定义于头文件 <chrono>
template< class Rep, class Period = std::ratio<1> > class duration;
类模板 std::chrono::duration 表示时间间隔。
它由 Rep 类型的计次数和计次周期组成,其中计次周期是一个编译期有理数常量,表示从一个计次到下一个的秒数。
存储于 duration 的数据仅有 Rep 类型的计次数。若 Rep 是浮点数,则 duration 能表示小数的计次数。 Period 被包含为时长类型的一部分,且只在不同时长间转换时使用。
指示时长可转换为拥有不同计次的时长
std::chrono::treat_as_floating_point
template <class Rep> | (C++11 起) |
std::chrono::treat_as_floating_point
特性帮助确定时期是否能转换成拥有另一种不同计次周期的时期。
二个时期间的隐式转换通常依赖于时期的计次周期。然而若 std::chrono::treat_as_floating_point<Rep>::value == true 则可发生隐式转换,不管计次周期如何。
辅助变量模板
template< class Rep > | (C++17 起) |
特化
可对程序定义类型特化 std::chrono::treat_as_floating_point
。
调用示例
#include <iostream>
#include <chrono>
#include <thread>
void timed_piece_of_code()
{
std::chrono::milliseconds simulated_work(2);
std::this_thread::sleep_for(simulated_work);
}
int main()
{
auto start = std::chrono::high_resolution_clock::now();
std::cout << "Running some timed piece of code..." << '\n';
timed_piece_of_code();
auto stop = std::chrono::high_resolution_clock::now();
// 浮点毫秒类型
using FpMilliseconds =
std::chrono::duration<float, std::chrono::milliseconds::period>;
static_assert(std::chrono::treat_as_floating_point<FpMilliseconds::rep>::value,
"Rep required to be floating point");
// 注意此处不允许隐式转换
auto i_ms = std::chrono::duration_cast<std::chrono::milliseconds>(stop - start);
// 注意此处允许隐式转换
auto f_ms = FpMilliseconds(stop - start);
std::cout << "Time in milliseconds, using default rep: "
<< i_ms.count() << '\n';
std::cout << "Time in milliseconds, using floating point rep: "
<< f_ms.count() << '\n';
}
输出
构造给定类型计次的零、最小及最大值
std::chrono::duration_values
template <class Rep> | (C++11 起) |
std::chrono::duration_values
类型定义三个常用时长:
- std::chrono::duration_values::zero
- std::chrono::duration_values::min
- std::chrono::duration_values::max
std::chrono::duration 中的 zero 、 min 和 max 方法转发其工作到这些方法。
能特化此类型,若表示 Rep
要求特定实现以返回这些时长对象。
调用示例
#include <iostream>
#include <chrono>
constexpr auto year = 31556952ll; // 格里高利历年的平均秒数
int main()
{
using shakes = std::chrono::duration<int, std::ratio<1, 100000000>>;
using jiffies = std::chrono::duration<int, std::centi>;
using microfortnights = std::chrono::duration<float, std::ratio<14 * 24 * 60 * 60, 1000000>>;
using nanocenturies = std::chrono::duration<float, std::ratio<100 * year, 1000000000>>;
std::chrono::seconds sec(1);
std::cout << "1 second is:\n";
// 无精度损失的整数尺度转换:无转型
std::cout << std::chrono::microseconds(sec).count() << " microseconds\n"
<< shakes(sec).count() << " shakes\n"
<< jiffies(sec).count() << " jiffies\n";
// 有精度损失的整数尺度转换:需要转型
std::cout << std::chrono::duration_cast<std::chrono::minutes>(sec).count()
<< " minutes\n";
// 浮点尺度转换:无转型
std::cout << microfortnights(sec).count() << " microfortnights\n"
<< nanocenturies(sec).count() << " nanocenturies\n";
}