此問題涉及到我剛纔的問題:float conversions in templates浮點的編譯時間常數轉換
我想阻止浮點常數的運行時間轉換。在我之前的問題中採用的流行觀點是,例如,允許float(.5)
轉換在運行時發生。但如何:
template <typename A, typename B>
constexpr A convert(B const a)
{
return a;
}
的斷言,以保證constexpr
功能的編譯時評估這裏討論: When does a constexpr function get evaluated at compile time?
是一個constexpr
+ assert
組合的唯一保證的方式來完成編譯這樣的轉換-時間?
SOLUTION:
很多頭部劃傷後,我得出的結論,我所提供的convert
功能是不必要的。我可以跟最好的是:
#define CONVERT(T, V) static constexpr T const T##_##V(V)
int main()
{
CONVERT(float, 1);
::std::cout << float_1 << std::endl;
return 0;
}
最好的選擇將是一個::std::integral_constant
對口floating_point_constant
,但很可惜,這是不可能寫一個。
我不能讓你想法,爲什麼不寫:12.34f,這將是浮動類型的常量。 – fghj
由於可能轉換爲'double','int'或其他類型。我希望在編譯時儘可能地獲得目標類型中源值的最佳近似值。 – user1095108