我对 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:修改代码以包括模板的专业化