什么是模板?
模板(Template)是 C++ 中实现泛型编程的核心工具。它允许我们编写与具体数据类型无关的代码,从而实现代码复用和类型安全。
为什么需要模板?
举个生活中的例子:
如果你要造一个能装水的杯子,你会设计一个通用的模具(模板),而不是为每一种液体(水、果汁、牛奶)都造一个杯子。
C++ 模板就是这个"模具"------它能根据不同的类型生成不同的"杯子"(函数或类)。
一、函数模板(Function Template)
cpp
template <typename T>
返回类型 函数名(参数列表) {
// 函数体
}
template:声明这是一个模板。
typename T:定义一个模板参数(T 可以是任意类型)。(class也可以)
cpp
#include <iostream>
using namespace std;
// 函数模板:加法
template <typename T>
T Add(T a, T b) {
return a + b;
}
int main() {
cout << Add(3, 5) << endl; // int 类型
cout << Add(3.14, 2.5) << endl; // double 类型
cout << Add('A', 'B') << endl; // char 类型
return 0;
}
Add 函数能处理 int、double、char 等类型。
优点:避免为每种类型写重复函数!
注意事项
模板参数推导:
编译器会自动根据传入参数推导类型 T。
例如:Add(3, 5) 推导出 T = int。
显式指定类型:
cpp
Add<int>(3, 5); // 显式指定 T = int
二、类模板(Class Template)
cpp
template <typename T>
class 类名 {
// 类成员
};
cpp
#include <iostream>
using namespace std;
// 类模板:栈
template <typename T>
class Stack {
private:
T data[100];
int top;
public:
Stack() : top(0) {}
void push(T value) {
data[top++] = value;
}
T pop() {
return data[--top];
}
};
int main() {
Stack<int> intStack; // int 类型栈
Stack<char> charStack; // char 类型栈
intStack.push(10);
intStack.push(20);
cout << intStack.pop() << endl; // 输出 20
charStack.push('A');
cout << charStack.pop() << endl; // 输出 A
return 0;
}
解释:
Stack<int> 和 Stack<char> 是两个不同类型的类。
优点:通过模板,用一份代码生成多个类型版本。
注意事项
模板类与普通类的区别:
模板类本身不是类,而是类的生成规则。
实例化后(如 Stack<int>)才是真正的类。
模板参数不止是类型:
可以是常量值(如 int N),例如:
cpp
template <int N>
class Array {
T data[N];
};
三、模板的限制与常见错误
示例 1:类型不匹配
cpp
Add("Hello", 123); // 编译错误!字符串和整数不能推导出统一的 T
示例 2:忘记包含头文件
cpp
// 忘记 #include <string>
string str; // 错误!
模板的进阶学习建议
模板特化:为特定类型定制行为。
模板元编程:利用模板实现编译期计算。
STL 源码:学习标准库中模板的高级用法(如 vector<T>、map<K, V>)。
小练习
试着用模板实现一个通用的最大值比较函数:
cpp
template <typename T>
T Max(T a, T b) {
return (a > b) ? a : b;
}
看看它能否支持 int、double、string!
希望这篇博客能帮你快速入门 C++ 模板!