當閱讀<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