std::chrono::duration详解
来源:互联网 发布:js value 赋值 编辑:程序博客网 时间:2024/06/18 14:41
std::chrono::duration(下文简称duration)是标准库中用来代表时间段的一个类模板。QQ:114211200
摘抄部分源码:
template<class _Rep, class _Period = ratio<1> > class duration;//声明template<class _Rep,class _Period>class duration{// represents a time durationpublic:typedef duration<_Rep, _Period> _Myt;typedef _Rep rep;typedef _Period period; constexpr _Rep count() const { // get stored rep return (_MyRep); }private:_Rep _MyRep;// the stored rep};
它有两个参数,第一个参数_Rep代表用什么样的类型来保存这个时间长度,必须是内置数值型或者是功能上类似内置数值型的类型(这个没有试过,应该是提供内置类型的所有接口就可以)。第二个参数_Period必须是std::ration模板类的一个实例,代表一个时间单位。_Period缺省值为std::ration<1>,此时它的单位为秒。它只有一个成员变量,用于保存_Period的个数。
duration<int, std::milli>代表以int保存的,单位为1/1000秒(毫秒)的时间长度。duration<int, std::milli> d(5),则d代表5毫秒。
duration<short, std::ratio<1,50>>代表以short保存的,单位为1/50秒的时间长度。duration<short, std::ratio<1,50>> d(50),则d代表1秒。
下面介绍一些重要的成员函数:
template<class _Rep2,class = typename enable_if<is_convertible<_Rep2, _Rep>::value&& (treat_as_floating_point<_Rep>::value|| !treat_as_floating_point<_Rep2>::value),void>::type>constexpr explicit duration(const _Rep2& _Val): _MyRep(static_cast<_Rep>(_Val)){// construct from representation}
使用另一个数值类型的值来构造。它是使用static_cast()来进行转换的。要求1:_Rep2必须能够隐式转换为_Rep:。要求2:_Rep为浮点型或者_Rep2不是浮点型。否则编译失败。
template<class _Rep2,class _Period2,class = typename enable_if<treat_as_floating_point<_Rep>::value|| (_Ratio_divide_sfinae<_Period2, _Period>::den == 1&& !treat_as_floating_point<_Rep2>::value),void>::type>constexpr duration(const duration<_Rep2, _Period2>& _Dur): _MyRep(chrono::duration_cast<_Myt>(_Dur).count()){// construct from a duration}使用另一个chrono对象来构造,内部通过duration_cast()来转换。以下2种情况可以通过编译:
1._Rep是一种浮点型。
2._Rep和_Rep都是一种整型,此时要求ratio_divide<_Period2, _Period>::type::den必须为1。意思就是_Period2是_Period的整数倍。
这样规定的目的是为了避免精度损失,以及避免从小单位向大单位转换。如果不使用这个构造函数,而直接使用duration_cast()函数,则直接绕过了这些检查,可能会导致精度丢失或数据截断。
constexpr _Rep count() const{// get stored repreturn (_MyRep);}得到当前对象保存的_Period的个数。
template<class _Rep1,class _Period1,class _Rep2,class _Period2> inlineconstexpr bool operator==(const duration<_Rep1, _Period1>& _Left,const duration<_Rep2, _Period2>& _Right){// test if duration == durationtypedef typename common_type<duration<_Rep1, _Period1>,duration<_Rep2, _Period2> >::type _CT;return (_CT(_Left).count() == _CT(_Right).count());}比较两个duration对象是否想等,由源码得知,比较前先将两个对象转换为通用类型,然后再比较。
例如:duration<int,std::ratio<2,3> >和duration<int,std::ratio<3,7> >都转换为duration<int,std::ratio<1,21> >。
还有min()、max()、zero()函数,分别代表最小、最大、0值,返回的都是自身类型。
剩下的就是一些算术运算和关系运算函数,不再多讲。
另外,stl还定义了一些常用的duration类型,在chrono头文件下:
typedef duration<long long, nano> nanoseconds;//纳秒typedef duration<long long, micro> microseconds;//微秒typedef duration<long long, milli> milliseconds;//毫秒typedef duration<long long> seconds;typedef duration<int, ratio<60> > minutes;typedef duration<int, ratio<3600> > hours;最后给出一个简单的测试程序:
void f(){ chrono::milliseconds m1(1000 * 60);//毫秒 chrono::duration<int, ratio<1>> m2(60); chrono::duration<int, ratio<60>> m3(1); chrono::minutes m4(1); assert(m1 == m2 && m1 == m3 && m1 == m4); m1++; ++m1; m2 = m3 + chrono::duration<int, ratio<60>>(100);//必须显示转换}
- std::chrono::duration详解
- C++11 std::chrono库详解
- C++11 std::chrono库详解
- C++11 std::chrono库详解
- std::理解chrono
- std::chrono时间处理类
- chrono
- Chrono
- Duration
- GCC 6.1 (C++17) doesn't compile std::atomic<std::chrono::system_clock::time_point> with default ctor
- C++11新特性,利用std::chrono精简传统获取系统时间的方法
- C++11 新的计时方法——std::chrono 大法好
- C++11新特性,利用std::chrono精简传统获取系统时间的方法
- C++11新特性,利用auto和std::chrono获取系统时间的方法
- C++11 新的计时方法——std::chrono 大法好
- C++11 新的计时方法——std::chrono 大法好
- std::string用法详解
- using namespace std 详解
- 【VIM】右键新标签中打开VIM文件
- jeesite 下载后的配置和运行以及使用代码生成功能
- 深入理解Java 虚拟机 读书笔记
- 关于IT人的职业生涯的一点感想
- Flume架构以及应用介绍
- std::chrono::duration详解
- Java Socket是什么
- 深度学习目标检测模型全面综述:Faster R-CNN、R-FCN和SSD
- GPS数据包解析--android端
- 13幅逻辑图,领略杜克大学的经典思维
- 数据结构|顺序表的建立(实验1)
- 店铺淘客如何做到单店利润过万的个人实战技巧
- Centos7如何修改ssh默认端口
- 【学习摘记】马士兵bbs改良版_课时10_dreamweaver修图