c++11 日期和时间工具(std::chrono::duration)(五)

定义于头文件 <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>
struct treat_as_floating_point : std::is_floating_point<Rep> {};

(C++11 起)

std::chrono::treat_as_floating_point 特性帮助确定时期是否能转换成拥有另一种不同计次周期的时期。

二个时期间的隐式转换通常依赖于时期的计次周期。然而若 std::chrono::treat_as_floating_point<Rep>::value == true 则可发生隐式转换,不管计次周期如何。

辅助变量模板

template< class Rep >
inline constexpr bool treat_as_floating_point_v = treat_as_floating_point<Rep>::value;

(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>
struct duration_values;

(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";
}

输出

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值