这个问题参考了我之前的问题: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
,但可惜,不可能写出一个。