【发布时间】:2012-08-27 08:05:12
【问题描述】:
我对 C++2011 的新关键字 constexpr 感到很困惑。当我编写编译时函数(尤其是数学函数)时,我想知道在哪里使用 constexpr 以及在哪里使用模板元编程。例如,如果我们采用整数 pow 函数:
// 1 :
template <int N> inline double tpow(double x)
{
return x*tpow<N-1>(x);
}
template <> inline double tpow<0>(double x)
{
return 1.0;
}
// 2 :
constexpr double cpow(double x, int N)
{
return (N>0) ? (x*cpow(x, N-1)) : (1.0);
}
// 3 :
template <int N> constexpr double tcpow(double x)
{
return x*tcpow<N-1>(x);
}
template <> constexpr double tcpow<0>(double x)
{
return 1.0;
}
第二个和第三个函数是等价的吗? 什么是最好的解决方案?是否产生相同的结果:
- 如果 x 在编译时已知
- 如果 x 在编译时未知
何时使用 constexpr 以及何时使用模板元编程?
编辑 1:修改代码以包含模板的特化
【问题讨论】:
-
即使模板函数的值在编译时是已知的,它也不是一个常量,也不能在需要常量的地方使用。但是,如果参数是常量,则 constexpr 函数可以保证给您一个常量。
标签: c++ templates c++11 metaprogramming constexpr