浮点常量的编译时转换

compile-time conversions of floating point constants

本文关键字:转换 编译 浮点常量      更新时间:2023-10-16

这个问题指的是我之前的问题:模板中的浮点转换

我想防止浮点常量的运行时转换。在我上一个问题中采取的普遍观点是,例如,允许在运行时进行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;
}

最好的选择是::std::integral_constantfloating_point_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);

确实(带有关于未使用变量的明显警告;-))