一、泛型编程基础
1.1 为什么需要泛型编程?
先看一个经典场景:实现交换两个变量的函数。如果不使用模板,我们需要为每种类型编写独立的重载函数:
// 交换 int 类型
void Swap(int& left, int& right) {
int temp = left; left = right; right = temp;
}
// 交换 double 类型
void Swap(double& left, double& right) {
double temp = left; left = right; right = temp;
}
这种方式的弊端很明显:代码复用率低,所有重载函数的逻辑完全一致,只是变量类型不同;可维护性差,修改逻辑时需同步所有重载;扩展性不足,新增类型需手动添加。
泛型编程的核心思想是编写与类型无关的通用代码,将重复的类型相关工作交给编译器处理。就像用模具浇筑零件一样,模板就是那个'通用模具',我们只需传入不同的'材料'(类型),编译器就会自动生成对应类型的'零件'。
1.2 模板:泛型编程的基础
模板分为函数模板和类模板两类:
- 函数模板:针对函数的通用实现,用于生成不同类型的函数。
- 类模板:针对类的通用实现,用于生成不同类型的类(如 STL 中的 vector、list 等容器)。
模板的本质是'代码生成器'——它本身并不是可执行代码,而是编译器用来生成具体类型代码的蓝图。
二、函数模板
2.1 函数模板的定义格式
函数模板的定义需要使用 template 关键字声明模板参数,语法如下:
template<typename T1, typename T2, ..., typename Tn>
返回值类型 函数名 (参数列表) {
// 函数体(与类型无关的通用逻辑)
}
template:声明模板的关键字。typename:定义模板参数的关键字,也可以用class替代。T1...Tn:模板参数(类型占位符),表示'待确定的类型'。
以交换函数为例,用函数模板改写后,代码会极度简洁:
// 函数模板:通用交换函数
template<typename T>
void {
T temp = left;
left = right;
right = temp;
}


