2012-11-02 21 views
5

有沒有更好的方法來完成以下工作?將模板類型與常數值比較

我有一個載體類,具有以下功能:

template <typename T> 
bool Vector3<T>::IsUnitVector() const 
{ 
    return IsAlmostEqual(this->GetLength(), One<T>::Value()); 
} 

由於T可以是浮動或雙(我使用顯式模板實例化,以確保只有這些類型的支持),我已經必須創建一個輔助類,它返回值1,在正確的類型:

template <typename T> 
struct One 
{ 
    static T Value(); 
}; 

template <> 
struct One<int> 
{ 
    static int Value() { return 1; } 
}; 

template <> 
struct One<float> 
{ 
    static float Value() { return 1.0f; } 
}; 

template <> 
struct One<double> 
{ 
    static double Value() { return 1.0; } 
}; 

這是不是太糟糕,直到我意識到我需要創建一個Zero類以及其他的比較。所以我的問題是,有沒有更好的方法來實現這一目標?

+1

我覺得這很常見。你是否試圖在「One 」的非專業版本中說'return 1;'?我認爲這會通過隱式轉換來實現。 – leemes

+0

我做了,但因爲IsAlmostEqual是模板化的,所以編譯器不知道要使用哪種類型(因爲int可以轉換爲float,double等)。 –

回答

8
return IsAlmostEqual(this->GetLength(), static_cast<T>(1)); 

小,非負整數的值應全部是由每個數字類型的精確表示,所以簡單地static_cast「荷蘭國際集團爲所需的類型應該是足夠的。

可替換地,假設IsAlmostEqual是具有T類型(例如,如IsAlmostEqual(T lhs, T rhs))的兩個參數的靜態成員功能,只需讓編譯器在函數調用自動執行轉換:

return IsAlmostEqual(this->GetLength(), 1); 
+0

隱式轉換不起作用,因爲我從編譯器中得到了模糊的類型T錯誤。 static_cast應該可以工作! –

+0

接受的答案 - 對於'static_cast '的建議。謝謝! –

0

爲什麼不只是讓編譯器做轉換工作

template<typename T, int val> 
bool Vector3<T>::_isConstant()const{ 
    return IsAlmostEqual(this->GetLength(), val); 
} 

template <typename T> 
bool Vector3<T>::IsUnitVector() const{ 
    return _isConstant<T,1>(); 
} 
template<typename T> 
bool Vector3<T>::IsZeroVector()const{ 
    return _isConstant<T,0>(); 
} 

不知道語法是否正確,但那是一般的想法。

0
template <typename T> 
struct Value 
{ 
    static T Zero(); 
    static T One(); 
}; 

template <> 
struct Value<int> 
{ 
    static int Zero() { return 0; } 
    static int One() { return 1; } 
}; 
// .. and so on