面试题答案
一键面试在模板元编程中,C++类的static
成员可用于存储编译期计算结果、实现类型特性萃取等功能。以下是一个完整的模板类示例,展示如何利用static
成员达成特定的编译期逻辑:
// 模板类用于计算阶乘
template <int N>
class Factorial {
public:
// static常量成员用于存储编译期计算结果
static const int value;
};
// 模板特化,终止递归
template <>
class Factorial<0> {
public:
static const int value = 1;
};
// 递归模板实例化
template <int N>
const int Factorial<N>::value = N * Factorial<N - 1>::value;
#include <iostream>
int main() {
// 打印5的阶乘,在编译期计算
std::cout << "Factorial of 5 is " << Factorial<5>::value << std::endl;
return 0;
}
在上述示例中:
Factorial
模板类:定义了一个static const int
类型的成员value
,用于存储编译期计算的阶乘结果。- 模板特化:针对
N == 0
的情况进行了模板特化,设置Factorial<0>::value
为1,作为递归终止条件。 - 递归实例化:对于其他
N
值,通过递归实例化Factorial<N - 1>
,并利用N * Factorial<N - 1>::value
计算Factorial<N>::value
,从而在编译期完成阶乘计算。
在类型特性萃取方面,同样可以利用static
成员来达成。例如:
// 模板类用于判断类型是否为整数
template <typename T>
class IsIntegral {
public:
static const bool value = false;
};
// 模板特化,针对整数类型
template <>
class IsIntegral<int> {
public:
static const bool value = true;
};
#include <iostream>
int main() {
std::cout << "Is int integral? " << (IsIntegral<int>::value? "Yes" : "No") << std::endl;
std::cout << "Is double integral? " << (IsIntegral<double>::value? "Yes" : "No") << std::endl;
return 0;
}
在此示例中,IsIntegral
模板类通过static const bool
成员value
来表示类型T
是否为整数。通过模板特化,针对int
类型给出了不同的value
值,实现了类型特性萃取。