この質問は私の前の質問を参照しています: 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
が、残念ながら、それを書くことはできません。