source code
template<long long _Num, long long _Den = 1>
struct ratio
{
static_assert(_Den != 0, "denominator cannot be zero");
static_assert(_Num >= -__INTMAX_MAX__ && _Den >= -__INTMAX_MAX__,
"out of range");
// Note: sign(N) * abs(N) == N
static constexpr intmax_t num =
_Num * __static_sign<_Den>::value / __static_gcd<_Num, _Den>::value;
static constexpr intmax_t den =
__static_abs<_Den>::value / __static_gcd<_Num, _Den>::value;
typedef ratio<num, den> type;
};
注意, 不是模板, 而是 (模板常量)!!!
我们几乎不会是使用到: ratio< 3, 4> a
这种写法!!! 不需要构造出一个变量来!!!
using a = std::ratio< 2, 3>;
using b = std::ratio< 3, 4>;
Cout( a::num, SE_, a::den);
Cout( b::num, SE_, b::den);
using add = std::ratio_add< a, b>; ' 注意这里!!! ab不是对象, 是(类型type)!!! '
Cout( add::num, SE_, add::den);
using sub = std::ratio_subtract< a, b>;
Cout( sub::num, SE_, sub::den);
using mul = std::ratio_multiply< a, b>;
Cout( mul::num, SE_, mul::den);
using div = std::ratio_divide< a, b>;
Cout( div::num, SE_, div::den);
using cmp = std::ratio_less< a, b>;
Cout( cmp::value);
source code
template <class Rep, class Period = ratio<1> >
class duration{
template <class Rep2>
duration(const Rep2 & _rep)
: _count( _rep) { }
Rep _count;
Rep count(){ return _count;}
}
duration, 顾名思义, 他是表示 一段时间
他的原理, 有2个:
min
为周期单位呢? 还是以second
呢? 还是以30 seconds
呢?Period
第二模板参数, 来表示的;Period
是std::ratio
类型!!! 其实说ratio是类型, 不准确; 因为我们知道, ratio里面, type类型本身 就会存储 常量值!!! 即数据;x * 1s
duration底层, 是以s
秒为单位的; 然后以秒 * 你的ratio; 得到 你的 周期单位count * 周期单位
便是你的总时间Rep
第一模板常参数Rep
是一个 arithmetic type
, 算术类型; 通常是int/ LL
;std::chrono::duration< int, std::ratio< 60, 1> > delta(1);
(周期是60s) (总时间是: 60s * 1)
std::chrono::duration< int, std::ratio< 1, 1> > delta(60);
(周期是1s) (总时间是: 1s * 60)
有几个 便利的 typedef
/// second
typedef duration<int64_t> seconds;
/// minutes
typedef duration<int64_t, ratio< 60>> minutes;
/// hours
typedef duration<int64_t, ratio<3600>> hours;
std::chrono::minutes( 3)
3分钟, 且以min为周期单位