簡體   English   中英

浮點常量的編譯時轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM