読ん<ratio>
でいて、偶発的な変換エラーから保護<chrono>
するタイプを想像しようとしました。Length
これは私が得たものです:
#include <iostream>
#include <ratio>
using namespace std;
template<typename Scale>
struct Length {
long long val_;
Length(long long val) : val_{val} {}
Length() = default;
Length(const Length&) = default;
Length& operator=(const Length&) = default;
// conversion
template<typename Scale2>
Length(const Length<Scale2> &other)
: val_{ other.val_*(Scale2::num*Scale::den)/(Scale2::den*Scale::num) }
{ }
// access
long long value() const { return val_; }
};
typedef Length<ratio<1>> m;
typedef Length<kilo> km;
typedef Length<milli> mm;
typedef Length<ratio<1000,1094>> yard;
このように使用するには
int main() {
km len_km = 300;
mm len_mm = len_km;
cout << " millimeter:" << len_mm.value() << endl;
cout << " m:" << m{len_km}.value() << endl;
cout << " yd:" << yard{len_km}.value() << endl;
}
そして今、すべての+
and*
操作を追加して、本当に快適にすることができました... :-)
私は疑問に思う:
- とにかくで定義する算術機能へのより簡単なアクセス
duration
はありますか? それらを使用して労力を軽減できますか?time_point
<chrono>
Length
- コンパイル時の定数は、変換コンストラクター
(Scale2::num*Scale::den)/(Scale2::den*Scale::num)
(分数/アンダーフロー?) で危険に思えますが、より良いメタプログラミングの方法を理解できません。ここに何かヒントはありますか?