【发布时间】:2011-05-31 09:00:21
【问题描述】:
在阅读<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)在转换构造函数(分数/下溢?)中似乎很危险,但我想不出更好的元编程方式,这里有什么提示吗?
【问题讨论】:
标签: c++11 metaprogramming c++-standard-library