2

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

4

1 回答 1

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

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

于 2013-09-21T15:33:23.103 回答