泛型编程是编写与类型无关的通用代码的重要手段,而模板正是其核心基石。通过模板,我们可以避免为每种数据类型重复编写相似的逻辑,从而提升代码复用性。
一、函数模板
1. 语法与原理
函数模板允许我们定义一个通用的函数框架,编译器会根据调用时的实参自动推导出具体的类型。
基本格式:
template<typename T1, typename T2, ......, typename Tn>
返回类型 函数名 (参数列表)
{
// 函数体
}
其中 typename 是定义模板参数的关键字,也可以使用 class,但不能使用 struct。模板参数的作用范围紧跟在 {} 之前。
示例:
template<typename T> void Swap(T& left, T& right) {
T temp = left;
left = right;
right = temp;
}
template<typename T1, typename T2>
T1 Func(const T1& x, const T2& y) {
std::cout << x << " " << y << std::endl;
return x;
}
在实际使用中,C++ 标准库已经提供了许多成熟的模板实现(如 std::swap),通常无需手动编写,直接调用即可。
2. 实例化机制
模板不会立即生成代码,而是在使用时进行实例化。主要有两种方式:
- 隐式实例化:编译器根据实参自动推演模板参数的实际类型。
- 显示实例化:在函数名后的
< >中显式指定模板参数的实际类型。
示例:
template<typename T> T Add(const T& left, const T& right) {
return left + right;
}
template<typename T> T* {
T[n];
}
{
a1 = , a2 = ;
d1 = , d2 = ;
std::cout << (a1, a2) << std::endl;
std::cout << (d1, d2) << std::endl;
std::cout << (a1, ()d1) << std::endl;
std::cout << (()a1, d1) << std::endl;
std::cout << <>(a1, d1) << std::endl;
std::cout << <>(a1, d1) << std::endl;
* p1 = <>();
;
}


