說我有一個簡單的函數,它是這樣的:如何在模板中定義浮點常量。避免在運行時強制轉換
template<typename T>
T get_half(T a){
return 0.5*a;
}
這個功能通常將T爲雙或浮點數進行評估。 該標準規定0.5將是一個雙精度浮點數(0.5f)。 如何編寫上面的代碼,以使0.5總是T型的,這樣在評估產品或返回時就不會有投射? 我想要的是0.5在編譯時是T的常量。這個問題的關鍵是我想在運行時避免轉換。
例如,如果我寫的:
template<typename T>
T get_half(T a){
return T(0.5)*a;
}
我可以絕對肯定的是T(0.5)在編譯時評價?如果不是,那麼完成此操作的正確方法是什麼?如果需要,我可以使用C++ 11。
預先感謝您。
在C++ 11我有一個numeric_traits類的東西如下(頭文件內)
template<typename Scalar>
struct numeric_traits{
static constexpr Scalar one_half = 0.5;
//Many other useful constants ....
};
所以我的代碼中我會爲使用:
template<typename T>
T get_half(T a){
return numeric_traits<T>::one_half*a;
}
這做什麼我希望ie 0.5在編譯時以我需要的精度解決,並且在運行時不會發生強制轉換。然而,缺點是:
- 我需要每次我需要一個新的常數
- 的sintax時間修改numeric_traits可能過於冗長煩人? (當然不是一個大問題)
- 這將是很好也許有這樣的:常量(0.5),它在運行時解析爲T型。
再次提前謝謝。
IIRC應用於文字的顯式轉換被認爲是'constexpr',所以是的,它在編譯時被評估。 – 2015-02-07 17:17:33
@ TheParamagneticCroissant在運行時仍然可以評估常量表達式中有效的東西。在編譯時需要評估表達式的場景比你想像的要少。 – hvd 2015-02-07 17:24:07
@TheParamagneticCroissant比你的評論。有關我的編輯的反饋會很高興。 – Alejandro 2015-02-10 14:39:43