c++同步获取持续时间为float或long
C++ chrono - get duration as float or long long
我有一个持续时间
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
。但我需要duration
为float
或long 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
。
一般来说,你应该避免使用像
float
或long long
这样的弱类型来表示持续时间。相反,您应该坚持使用"富"类型,例如std::chrono::milliseconds或std::chrono::duration的适当专门化。这些类型有助于正确的使用和可读性,并通过类型检查帮助防止错误。
- ——Shape&年代;
不明确/过度通用:
- Object obj;
…obj.draw ();——矩形(int, int, int, int);
…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:
...
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
}
相关文章:
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 没有从阵列<float>到阵列<int>的可行转换
- 数组下标的类型"float*[float]"无效
- 没有合适的构造函数可以从"float"转换为"_D3DCOLORVALUE"
- 错误:隐式转换更改符号:'int'到'unsigned long'
- 为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)
- 将 **float array 从 C++ Dll 传递给 python
- c++模板实例化可以使用int、long等,但不能使用float、double等
- C++11自动.从float转换为long
- 从'float'转换为'LONG'需要缩小转换范围
- 为什么要使用float over double,或者double over long double
- c++从long转换为float的奇怪错误
- c++同步获取持续时间为float或long
- 为什么要将float类型的指针转换为long类型的指针,然后解引用呢?
- 我如何使用3个重载函数(参数的差异是int, long, float)同时只要求一个输入项
- 使用unsigned long long代替float来防止包装