面试题答案
一键面试模板类定义及初始化成员列表实现
#include <iostream>
// 辅助模板类用于计算数组元素总和
template <typename T, T... values>
struct Sum {
static constexpr T value = 0;
};
template <typename T, T first, T... rest>
struct Sum<T, first, rest...> {
static constexpr T value = first + Sum<T, rest...>::value;
};
// 主模板类TemplateClass
template <typename T, T... values>
class TemplateClass {
private:
// 依赖于T的成员变量
static constexpr T sumValue = Sum<T, values...>::value;
public:
// 用于获取总和的成员函数
static constexpr T getSum() {
return sumValue;
}
};
模板元编程原理及初始化过程解释
- 模板元编程原理:
- C++模板元编程是在编译期进行计算的技术。模板参数不仅可以是类型,还可以是常量表达式。编译器在实例化模板时,会根据模板参数生成具体的代码。这里通过递归定义的模板类
Sum
,编译器在编译期就完成了数组元素总和的计算。
- C++模板元编程是在编译期进行计算的技术。模板参数不仅可以是类型,还可以是常量表达式。编译器在实例化模板时,会根据模板参数生成具体的代码。这里通过递归定义的模板类
- 初始化过程:
- Sum模板类初始化:
- 首先,定义了
Sum
模板类的基础版本template <typename T, T... values> struct Sum { static constexpr T value = 0; }
,它是递归的终止条件。当没有更多元素需要相加时,总和为0。 - 然后,定义了递归版本
template <typename T, T first, T... rest> struct Sum<T, first, rest...> { static constexpr T value = first + Sum<T, rest...>::value; }
。这个版本会将当前元素first
与剩余元素总和Sum<T, rest...>::value
相加,不断递归直到到达基础版本。
- 首先,定义了
- TemplateClass模板类初始化:
TemplateClass
模板类中定义了static constexpr T sumValue = Sum<T, values...>::value;
,在编译期,编译器会根据传入的values
参数列表实例化Sum
模板类,计算出总和并赋值给sumValue
。getSum
成员函数用于返回这个编译期计算出的总和。
- Sum模板类初始化:
使用示例
int main() {
// 实例化TemplateClass并计算数组{1, 2, 3}的总和
TemplateClass<int, 1, 2, 3> tc;
std::cout << "Sum is: " << tc.getSum() << std::endl;
return 0;
}
这个示例中,TemplateClass
实例化时传入了整数1, 2, 3,编译期计算出它们的总和为6并输出。