面试题答案
一键面试#include <iostream>
// 函数模板声明
template <int a, int b>
struct Pow {
// 递归计算a的b次幂
static const int value = a * Pow<a, b - 1>::value;
};
// 特化模板,处理b为0的情况
template <int a>
struct Pow<a, 0> {
static const int value = 1;
};
int main() {
// 测试
std::cout << "2的3次幂是: " << Pow<2, 3>::value << std::endl;
std::cout << "5的0次幂是: " << Pow<5, 0>::value << std::endl;
return 0;
}
编译过程解释
- 模板实例化:当编译器遇到
Pow<2, 3>::value
这样的表达式时,会实例化Pow<2, 3>
模板。由于b
不为0,它会递归实例化Pow<2, 2>
,Pow<2, 1>
,直到Pow<2, 0>
。 - 特化模板处理边界情况:
Pow<2, 0>
是一个特化模板,它定义了b
为0时的结果为1。这个特化模板终止了递归实例化过程。 - 递归计算:从
Pow<2, 0>
开始,逐步返回计算结果。Pow<2, 1>
的value
为2 * Pow<2, 0>::value
,即2 * 1 = 2
;Pow<2, 2>
的value
为2 * Pow<2, 1>::value
,即2 * 2 = 4
;Pow<2, 3>
的value
为2 * Pow<2, 2>::value
,即2 * 4 = 8
。
通过这种方式,在编译时完成了 a
的 b
次幂的计算,并且处理了 b
为0的边界情况。