在阅读时<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;
}
现在我可以添加所有+
和*
操作来变得非常舒服...... :-)
我想知道:
- 是否有更容易访问
duration
和time_point
定义的算术设施<chrono>
?我可以用那些减少努力Length
吗? - 编译时常
(Scale2::num*Scale::den)/(Scale2::den*Scale::num)
量在转换构造函数中似乎很危险(分数/下溢?),但我想不出更好的元编程方式,这里有什么提示吗?