浮点常量的编译时转换

时间:2013-09-21 14:29:59

标签: c++ c++11

此问题涉及我之前的问题: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对应方,但唉,不可能写一个。

1 个答案:

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

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