2010-04-13 30 views
2

我在寫一個模板類,它將浮點類型(float,double,decimal,GMP)作爲參數。不過,我的類需要各種數字常量。其中一些是有理數(int/int),而另一些則是非理性的,可用於30位左右的小數位。用於模板代碼的高精度常量

什麼是去初始化這些常量的最好辦法,所以:

T c1 = <constant>; 

其中T是模板類型?雖然我總是可以回退雙打(T c1 = 0.1415926535 ...),並依靠編譯器/隱式初始化程序將其轉換爲適當的類型,但如果可能的話,我希望保留更高的精度。

我對當前的解決方案以及那些C++ 0x(或者它是C++ 1x?)可能帶來的表感興趣。

+0

我覺得是需要專業化。 – kennytm 2010-04-13 22:36:10

+3

非類型模板參數不能有浮點類型;它必須具有整型或枚舉類型,或者是指向函數的指針或引用。 – 2010-04-13 22:37:21

+0

確實如此,但是沒有什麼能阻止你使用'long long'來存儲尾數和另一個'long long'來存儲指數,只要你願意自己實現數學運算... – Will 2010-04-13 22:52:04

回答

2

我認爲這樣做最簡單的方法是創建一個擁有常量一個專門的容器類,像這樣:

template<class T> 
class Constants 
{ 
public: 
    static const T pi = T(3.1415); 
}; 

//Example specialization: 
template<> 
class Constants<double> 
{ 
public: 
    static const double pi = 3.1415926535897932384626433832795; 
}; 

在你真正的類,那麼你可以做這樣的事情:

const T c1 = Constants<T>::pi; 

這可以避免你必須編寫完整的專業化類來重新定義這些常量。

請注意,默認行爲可以回退到隱式雙分配。

+0

我想我會跟着去吧。有些不幸的是,普通的舊類型不能構建:雙Pi =「3.14169」;不像大多數高價格類型(GMP等)。 – 2010-04-14 09:59:48

0

就和想法,我會超載類型爲每個特殊的常量:

template<typename T> 
struct PI { operator double() { return 3.145243; } 

template<> 
struct PI<float> { operator float() { return 3.14f; } 

template<> 
struct PI<int> { operator int() { return 3; } 

... 

然後使用

T result = 2*PI<T>();