c++同步获取持续时间为float或long

C++ chrono - get duration as float or long long

本文关键字:float long 持续时间 同步 获取 c++      更新时间:2023-10-16

我有一个持续时间

typedef std::chrono::high_resolution_clock Clock;
Clock::time_point       beginTime;
Clock::time_point       endTime;
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - beginTime);

得到std::chrono::milliseconds中的duration。但我需要durationfloatlong long。怎么做呢?

从文档

template<
    class Rep, 
    class Period = std::ratio<1> 
> class duration;

类模板std::chrono::duration表示时间间隔。它由Rep类型的滴答计数和一个滴答周期组成,其中标记周期是一个编译时有理数常数,表示从一个滴答到下一个滴答的秒数。

:

count返回滴答的计数

因此duration存储指定时间段的刻度数,count将使用底层表示类型返回该数字。因此,如果持续时间的表示为long long,周期为std::milli,那么.count()将返回一个等于持续时间表示的毫秒数的long long


一般来说,你应该避免使用像floatlong long这样的弱类型来表示持续时间。相反,您应该坚持使用"富"类型,例如std::chrono::milliseconds或std::chrono::duration的适当专门化。这些类型有助于正确的使用和可读性,并通过类型检查帮助防止错误。
  • 不明确/过度通用:

    - Object obj;
    …obj.draw ();——矩形(int, int, int, int);

  • ——Shape&年代;
    …s.draw ();-矩形(Point top_left, Point bottom_right);
    -矩形(点top_left, Box_hw b);

本;幻灯片18,来自Bjarne的演讲


std::chrono是"一个物理量库的一致子集,它只处理时间单位,并且只处理那些指数等于0和1的时间单位。"

如果你需要处理大量的时间,你应该利用这个库,或者一个提供更完整的单位系统的库,比如boost::units。

数量必须降级为弱类型值的情况很少。例如,当必须使用需要此类类型的API时。

作为float的答案。

std::chrono的持续时间类型为整型。但是,duration类可以接受float

查看我的duration typedefs:

https://github.com/faithandbrave/Shand/blob/master/shand/duration.hpp

...
template <class Rep>
using seconds_t = std::chrono::duration<Rep>;
using seconds_f = seconds_t<float>;
using seconds_d = seconds_t<double>;
using seconds_ld = seconds_t<long double>;
template <class Rep>
using minutes_t =  std::chrono::duration<Rep, std::ratio<60>>;
using minutes_f = minutes_t<float>;
using minutes_d = minutes_t<double>;
using minutes_ld = minutes_t<long double>;
...

这些持续时间的使用情况如下:

#include <iostream>
#include <shand/duration.hpp>
int main()
{
    std::chrono::seconds int_s(3);
    shand::minutes_f float_m = int_s; // without `duration_cast`
    std::cout << float_m.count() << std::endl; // 0.05
}