namespace std {
template <class R1, class R2>
using ratio_multiply = …;
}
概要
ratio_multiply
は、左辺のratio
と右辺のratio
を乗算したratio
型を作るエイリアステンプレートである。
効果
乗算結果は、ratio<R1::num * R2::num, R1::den * R2::den>
という型になる。
実装によっては、演算アルゴリズムによってオーバーフローが起こる可能性がある。オーバーフローが起こった場合、プログラムは不適格となる。
例
#include <ratio>
int main()
{
using r1 = std::ratio<2, 5>;
using r2 = std::ratio<3, 5>;
using result = std::ratio_multiply<r1, r2>;
static_assert(result::num == 6, "result num is 6");
static_assert(result::den == 25, "result den is 25");
}
xxxxxxxxxx
#include <ratio>
int main()
{
using r1 = std::ratio<2, 5>;
using r2 = std::ratio<3, 5>;
using result = std::ratio_multiply<r1, r2>;
static_assert(result::num == 6, "result num is 6");
static_assert(result::den == 25, "result den is 25");
}
出力
乗算で大きいduration型を定義する例
#include <iostream>
#include <ratio>
#include <chrono>
int main()
{
// 「86400秒」という直値で「日」を定義する代わりに、
// using days = std::chrono::duration<long, std::ratio<86400>>;
// 「時」を24倍して「日」を定義する
using days = std::chrono::duration<
long,
std::ratio_multiply<
std::chrono::hours::period,
std::ratio<24>
>
>;
days three(3);
std::cout << three.count() << std::endl;
}
xxxxxxxxxx
#include <iostream>
#include <ratio>
#include <chrono>
int main()
{
// 「86400秒」という直値で「日」を定義する代わりに、
// using days = std::chrono::duration<long, std::ratio<86400>>;
// 「時」を24倍して「日」を定義する
using days = std::chrono::duration<
long,
std::ratio_multiply<
std::chrono::hours::period,
std::ratio<24>
>
>;
days three(3);
std::cout << three.count() << std::endl;
}
出力
3
バージョン
言語
- C++11
処理系
- Clang: 3.0 ✅
- GCC: 4.6.4 ✅
- Visual C++: ??