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
,对吗?
他们对这样的模板有明显的优势吗?也许我只是没有看到它。
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
.
演示。
在您发布的代码中(碰巧使用template
s 但不使用元编程!),只有 是Y
在编译时已知的,并X
作为运行时参数传递。这意味着结果也将在运行时计算,我们必须依赖基于编译器的优化。在这种情况下最好使用std::pow(..)
。
归档时间: |
|
查看次数: |
609 次 |
最近记录: |