函数模板通过template定义通用函数,如T max(T a, T b),编译器自动推导类型;类模板如template class Stack用于创建泛型类,成员函数需用template在类外实现,使用时必须指定类型参数,且模板代码需放在头文件中供编译器实例化。

模板是C++中实现泛型编程的核心工具,它允许我们编写与数据类型无关的函数和类。通过模板,可以写出更通用、可复用的代码,避免重复编写相似逻辑。C++中的模板主要分为函数模板和类模板两种形式。
函数模板怎么写
函数模板用于定义一个通用函数,能够处理多种数据类型。编译器会根据调用时传入的参数类型自动推导并生成对应的函数实例。
基本语法如下:
templateT max(T a, T b) {
return a > b ? a : b;
}
说明:
立即学习“C++免费学习笔记(深入)”;
-
template
声明了一个模板,T 是占位类型名(也可以用 class 关键字,两者在模板中等价) - 函数返回类型和参数都使用 T,表示它可以适配任意支持 > 操作的类型
- 调用时无需显式指定类型,编译器自动推导
使用示例:
int x = max(3, 5); // T 推导为 intdouble y = max(2.5, 3.7); // T 推导为 double
如果需要多个类型参数,可以扩展:
templateauto add(T a, U b) -> decltype(a + b) {
return a + b;
}
这里使用了尾置返回类型来确定返回值类型。
类模板怎么写
类模板用于定义通用类,比如标准库中的 vector、list 都是类模板。它允许类中的数据成员、成员函数使用泛型类型。
基本语法:
templateclass Stack {
private:
T data[100];
int top;
public:
Stack() : top(-1) {}
void push(const T& item);
T pop();
bool empty() const;
};
成员函数可以在类外定义,但需要带上模板前缀:
templatevoid Stack
if (top data[++top] = item;
}
}
使用方式:
StackStack
s1.push(10);
s2.push("hello");
注意:类模板在使用时必须明确指定类型参数。
模板的注意事项
虽然模板非常强大,但也有一些使用上的限制和技巧:
- 模板代码通常放在头文件中,因为编译器需要在编译时看到完整定义才能实例化
- 模板不支持分离编译(声明在 .h,实现不能单独放在 .cpp)
- 可以使用非类型模板参数,例如整数:
class Array {
T data[N];
};
然后这样使用:Array
- 支持默认模板参数:
class Number {
T value;
};
此时可以 Number n; 使用默认类型 int。
基本上就这些。掌握函数模板和类模板的写法后,就能理解STL大部分容器和算法的设计思路。模板机制让C++在保持高性能的同时实现了高度抽象,是现代C++编程的重要基础。多写几个例子练手,很快就能上手。









