该模板如何通过运行时递归实现编译时优化?

joh*_*ers 5 c++ templates metaprogramming

我了解使用模板创建编译时阶乘计算的著名示例,这样就不需要递归运行时计算。在这样的示例中,计算所需的所有值在编译时都是已知的。

但是我遇到了另一个使用模板计算数字幂的示例,但我不明白这是如何对类似的运行时递归函数进行优化:

template<int n>
inline int power(const int& m) { return power<n-1>(m)*m;}

template<>
inline int power<1>(const int& m) { return m;}

template<>
inline int power<0>(const int& m) { return 1;}

cout << power<3>(m)<<endl;
Run Code Online (Sandbox Code Playgroud)

显然,m在这个例子中,在编译时是无法知道的。所以在运行时,仍然会执行一系列计算,结果与 基本相同m*m*m,对吗?

他们对这样的模板有明显的优势吗?也许我只是没有看到它。

iam*_*ind 4

X仅当您在编译时知道和Y时,您才能获得模板元编程的优势。示例代码:

template<unsigned int X, unsigned int N>
struct Power { static const unsigned int value = X * Power<X,N-1>::value; };

template<unsigned int X>
struct Power<X,0> { static const unsigned int value = 1; };
Run Code Online (Sandbox Code Playgroud)

用途:Power<X,Y>::value确定X^Y.
演示

在您发布的代码中(碰巧使用templates 但不使用元编程!),只有 是Y在编译时已知的,并X作为运行时参数传递。这意味着结果也将在运行时计算,我们必须依赖基于编译器的优化。在这种情况下最好使用std::pow(..)