2013-09-21 14 views
2

此問題涉及到我剛纔的問題: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,但很可惜,這是不可能寫一個。

+0

我不能讓你想法,爲什麼不寫:12.34f,這將是浮動類型的常量。 – fghj

+0

由於可能轉換爲'double','int'或其他類型。我希望在編譯時儘可能地獲得目標類型中源值的最佳近似值。 – user1095108

回答

1

它甚至比我想象的要簡單:

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); 

做(約未使用的變量明顯的警告;-))

+0

當然,但你需要一個'constexpr'變量。 – user1095108

+0

@ user1095108和?... – stefan

+0

我只想將'convert' invocations放在任意表達式中,而不用擔心運行時調用。 – user1095108