1 模板
1.1 模板的概念
模板是一种通用的编程工具,允许使用虚拟类型(泛型)定义函数或类,从而实现对不同数据类型的复用。通过模板编写的代码可以自动适应多种数据类型,减少重复代码。
模板的特点:
- 通用性:一套逻辑可适用于多种数据类型(如
int、float、自定义类等)。 - 类型安全:编译时进行类型检查,避免运行时错误。
- 编译时生成代码:编译器根据实际调用类型生成对应的具体函数或类。
1.2 函数模板
1.2.1 函数模板语法
作用:定义一个通用函数,其返回值类型和参数类型可用虚拟类型(如T)表示,调用时根据实际类型实例化。
语法:
template <typename T> //template<class T> T functionName(T param1, T param2) { // 函数体 }解释:
template <typename T>声明模板,T为占位符类型。- 函数参数、返回值或局部变量均可使用
T。
示例代码:
#include <iostream> using namespace std; template <typename T> T maxValue(T a, T b) { return a > b ? a : b; } int main() { // 1. 自动类型推导 cout << maxValue(3, 5) << endl; // 推导为 int cout << maxValue(3.14, 2.71) << endl; // 推导为 double // 2. 显式指定类型 cout << maxValue<double>(3, 2.71) << endl; // 强制为 double return 0; }1.2.2 函数模板注意事项
自动类型推导的一致性:
推导的多个参数类型必须一致,否则编译失败。// 错误示例:a 是 int,b 是 double cout << maxValue(3, 2.71) << endl; // 编译错误必须明确数据类型:
模板类型T必须能被编译器推断或显式指定。template <typename T> void printData(T data) { cout << data << endl; } int main() { printData(10); // 正确:推导为 int printData<int>(10); // 正确:显式指定 printData(); // 错误:无法推断 T }特殊处理场景:
若函数模板与普通函数同名,优先调用普通函数(除非显式指定模板)。void print(int val) { cout << "普通函数" << endl; } template <typename T> void print(T val) { cout << "模板函数" << endl; } int main() { print(10); // 调用普通函数 print<int>(10); // 调用模板函数 }
扩展示例:
// 多类型模板参数 template <typename T1, typename T2> void printPair(T1 a, T2 b) { cout << a << ", " << b << endl; } int main() { printPair(1, "Hello"); // 输出: 1, Hello }