从现在开始,我们开始介绍 C++ 风格的时间处理,在这之前,首先要介绍
std::ratio
。因为 C++ 的chrono
库中的时间段(duration
)定义离不开std::ratio
,不了解std::ratio
,就很难理解duration
的定义。
1 std::ratio 的基本意义
std::ratio
是 C++ 11 引入的数值计算库的一部分,对应的头文件是 (如果使用时间库,只要包含头文件就可以了,这个头文件内部引用了 头文件)。有资料将其称之为分数,其实它只是提供了比例或比率的概念,并且std::ratio
是个完完全全的泛型库,它的所有计算都是在编译期间完成的,其定义如下:
template<std::intmax_t Num, std::intmax_t Denom = 1>
class ratio;
std::intmax_t
表示系统支持的最大位宽的整数,一般 32 位系统中代表的是std::int32_t
,在 64 位的系统上代表的是std::int64_t
。ratio
类还有两个静态成员,一个是ratio::num
,表示约分后的分子,另一个是ratio::den
,表示约分后的分母。看一下例子代码就明了了:
assert((std::ratio<24, 32>::num == 3));
assert((std::ratio<24, 32>::den == 4));
//或者:
std::cout << "std::ratio<24, 32>::num = " << std::ratio<24, 32>::num << std::endl;
std::cout << "std::ratio<24, 32>::den = " << std::ratio<24, 32>::den << std::endl;
由于std::ratio
必须在编译期实例化的,所以std::ratio
类的两个模板参数必须都是常量或常量表达式(constexpr):
int n = 10;
int m = 100;
std::ratio<n, m>::num; //ERROR,编译错误
const int n = 10;