此问题涉及我之前的问题: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
组合是否是在编译时完成此类转换的唯一保证方式?
解决方案:
经过大量的讨论,我得出结论,我提供的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
对应方,但唉,不可能写一个。
答案 0 :(得分: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);
确实(有关未使用变量的明显警告;-))