std::ratio, std::chrono::duration

catalog

  • ratio
  • std::chrono::duration

ratio

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

std::chrono::duration

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个:

  • 1, 他有一个"周期单位"的概念; 比如说, 你要表示 “2min”; 那么, 是以min为周期单位呢? 还是以second呢? 还是以30 seconds呢?
    所以, 这个"周期单位", 是用Period第二模板参数, 来表示的;
    Periodstd::ratio类型!!! 其实说ratio是类型, 不准确; 因为我们知道, ratio里面, type类型本身 就会存储 常量值!!! 即数据;
    比如, 这ratio的值 是x; 则, 表示, 一个周期单位是: x * 1s duration底层, 是以s秒为单位的; 然后以秒 * 你的ratio; 得到 你的 周期单位
  • 2, 有了(周期), 然后你需要再设置一个(个数count); 即, count * 周期单位 便是你的总时间
    这个count的 类型type, 即为: 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为周期单位

你可能感兴趣的:(计算机知识,c++,visual,studio,开发语言)