[英]compile-time conversions of floating point constants
這個問題涉及我以前的問題: 模板中的浮點轉換
我想防止浮點常量的運行時轉換。 我在上一個問題中所采用的普遍觀點是,例如,在運行時允許進行float(.5)
轉換。 但是如何:
template <typename A, typename B>
constexpr A convert(B const a)
{
return a;
}
這里討論一個保證對constexpr
函數進行編譯時評估的斷言: 何時在編譯時評估constexpr函數?
constexpr
+ assert
組合是在編譯時完成此類轉換的唯一保證方法嗎?
解:
經過大量的努力之后,我得出的結論是,我提供的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;
}
最好的選擇將是一個floating_point_constant
對口::std::integral_constant
,但很可惜,這是不可能寫一個。
它比我想象的還要簡單:
int a = 1;
constexpr auto b = convert<float>(a);
不會在編譯
const int a = 1;
constexpr auto b = convert<float>(a);
constexpr auto c = convert<float>(1);
constexpr auto d = convert<float>(1 + 2);
constexpr auto e = convert<int>(1.0 + 2.0);
確實(帶有關於未使用變量的明顯警告;-))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.