当阅读<ratio>
和<chrono>
时,我试图想象一个Length
类型,它可以防止意外转换错误。C++ 0x使用<ratio>更安全长度类型
这是我得到:
#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)
在转换构造函数(fraction/underflow?)中似乎很危险,但我无法找到更好的元编程方式,这里的任何提示?
我仍然在我有趣的项目列表中。你在这里给了我一个很好的支持。我可以在大多数地方跟踪你,我同意需要* gcd *。编译时* gcd *对我来说已经是一个相当大的挑战了,我猜(constexpr不能递归,对吗?单线非递归循环gcd计算在哪里?叹*)。我还没有找到时间。但我会......我会的。 – towi 2011-10-10 19:51:02
这个代码是免费使用,但你想要的只是保留它的版权:http://llvm.org/svn/llvm-project/libcxx/trunk/include/ratio – 2011-10-10 20:56:50