好的,我们来学习一下 C++ 模板编程的基础知识,这是泛型编程的核心。
1. 为什么需要模板?
想象一下,你需要编写一个函数来求两个数的最大值。如果只处理 int 类型,很简单:
int max(int a, int b) {
return (a > b) ? a : b;
}
但如果还需要处理 double、float 甚至自定义类型呢?为每种类型都重写一个函数非常繁琐且容易出错。模板就是为了解决这类问题:编写一次代码,适用于多种类型。
2. 函数模板
函数模板定义了函数的通用模式。使用 template 关键字声明模板参数列表:
template <typename T> // T 是类型参数占位符
T max(T a, T b) {
return (a > b) ? a : b;
}
使用方式:
int main() {
int i = max(10, 20); // T 被推断为 int
double d = max(3.14, 2.71); // T 被推断为 double
return 0;
}
编译器在调用点会根据实参类型自动实例化(生成)特定版本的函数。
3. 类模板
类模板允许创建通用类。例如,一个简单的泛型栈:
template <typename T> // T 表示元素类型
class Stack {
private:
T elements[100];
int top;
public:
Stack() : top(-1) {}
void push(T const& elem) {
elements[++top] = elem;
}
T pop() {
return elements[top–];
}
};
使用方式:
int main() {
Stack<int> intStack; // 存储 int 的栈
Stack<std::string> strStack; // 存储 string 的栈
return 0;
}
4. 模板参数
模板参数不仅可以是类型(typename T),还可以是:
- 非类型参数: 如整型常量、指针等
template <typename T, int size>
class Array {
T data[size];
}; - 模板模板参数: 参数本身是模板(较少使用)
5. 模板特化
有时需要对特定类型提供特殊实现:
// 通用模板
template <typename T>
class Printer {
public:
void print(T value) {
std::cout << value << std::endl;
}
};
// 特化版本:针对 std::string
template <>
class Printer<std::string> {
public:
void print(std::string value) {
std::cout << "String: " << value << std::endl;
}
};
https://weibo.com/tv/show/1034:5272929227964434
https://weibo.com/tv/show/1034:5272929227964434/
https://weibo.com/tv/show/1034:5272929152204803
https://weibo.com/tv/show/1034:5272929152204803/
https://weibo.com/tv/show/1034:5272929227964434
https://weibo.com/tv/show/1034:5272929227964434/
https://weibo.com/tv/show/1034:5272929152204803
https://weibo.com/tv/show/1034:5272929152204803/
实践建议:
通过模板,C++ 实现了强大的泛型编程能力,是 STL 等库的基础。理解其原理后,可以写出更灵活、高效的代码。



