C ++ chrono - 获取float或long long的持续时间

时间:2014-07-10 21:40:54

标签: c++ chrono

我有一段时间

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);

我在duration获得std::chrono::milliseconds。但我需要duration作为floatlong long。怎么做?

2 个答案:

答案 0 :(得分:7)

来自documentation

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

类模板std :: chrono :: duration表示时间间隔。它   由Rep类型的刻度和刻度周期组成,其中   tick period是一个代表时间的编译时有理常数   从一个刻度到下一个刻度的秒数。

  

count返回刻度计数

因此,持续时间存储指定时间段内的多个刻度,count将使用基础表示类型返回该数字。因此,如果持续时间的表示为long long,且句点为std::milli,则.count()将返回等于持续时间所代表的毫秒数的long long


通常,您应该避免使用floatlong long等弱类型来表示持续时间。相反,你应该坚持使用'rich' types,例如std :: chrono :: milliseconds或std :: chrono :: duration的适当特化。这些类型有助于正确使用和可读性,并通过类型检查帮助防止错误。

  
      
  • 未指定/过于笼统:
       - void increase_speed(double);
       - 对象obj; ... obj.draw();
       - Rectangle(int,int,int,int);

  •   
  • 更好: - void increase_speed(速度);
       - 形状和S; ... s.draw();
       - 矩形(Point top_left,Point bottom_right);
       - 矩形(Point top_left,Box_hw b);

  •   
     

- 从Bjarne's talk

滑动18

std::chrono is&#34;物理量库的一致子集,仅处理时间单位,仅处理指数等于0和1的那些时间单位。&#34; < / p>

如果您需要处理大量时间,您应该利用此库,或者提供更完整的单位系统的库,例如boost::units

极少数情况下,数量必须降级为弱类型值。例如,当必须使用需要此类型的API时。否则应该避免。

答案 1 :(得分:1)

作为float回答。

std::chrono的持续时间typedef是整数。但是,duration班级可以接受float

查看我的duration typedef:

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
}