2

この質問は私の前の質問を参照しています: float conversions in templates

浮動小数点定数のランタイム変換を防止したいと考えています。前回の質問での一般的な見解は、たとえば、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が、残念ながら、それを書くことはできません。

4

1 に答える 1

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

します(未使用の変数に関する明らかな警告があります;-))

于 2013-09-21T15:33:23.103 に答える