今天在寫代碼,遇到了需要將std::chrono::duration轉換到timespec,需要得到秒和納秒,於是乎,我想到用std::nano::den(std::ratio<1, 1000000000>的別名)來做爲納秒求餘的分母。
std::ratio的定義在<ratio>,核心代碼如下:
/**
* @brief Provides compile-time rational arithmetic.
*
* This class template represents any finite rational number with a
* numerator and denominator representable by compile-time constants of
* type intmax_t. The ratio is simplified when instantiated.
*
* For example:
* @code
* std::ratio<7,-21>::num == -1;
* std::ratio<7,-21>::den == 3;
* @endcode
*
*/
template<intmax_t _Num, intmax_t _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;
};
第一個參數_Num
代表了分子,第二個參數 _Den
代表了分母。num
是約分後的分子,den
是約分後的分母。num
是numerator
的縮寫,表示分子。den
是denominator
的縮寫,表示分母。
示例代碼:
// ratio example
#include <iostream>
#include <ratio>
int main ()
{
typedef std::ratio<1,3> one_third;
typedef std::ratio<2,4> two_fourths;
std::cout << "one_third= " << one_third::num << "/" << one_third::den << std::endl;
std::cout << "two_fourths= " << two_fourths::num << "/" << two_fourths::den << std::endl;
typedef std::ratio_add<one_third,two_fourths> sum;
std::cout << "sum= " << sum::num << "/" << sum::den;
std::cout << " (which is: " << ( double(sum::num) / sum::den ) << ")" << std::endl;
std::cout << "1 kilogram has " << ( std::kilo::num / std::kilo::den ) << " grams";
std::cout << std::endl;
return 0;
}
運行結果:
one_third= 1/3 two_fourths= 1/2 sum= 5/6 (which is 0.833333) 1 kilogram has 1000 grams
reference: