1. 函数模板深度解析
1.1 函数模板基础概念
函数模板是C++泛型编程的核心工具,它允许我们编写与数据类型无关的通用代码。模板的本质是编译器根据调用时提供的具体类型自动生成对应的函数版本。
模板定义的基本语法如下:
cpp复制template<typename T> // 或者 template<class T>
T add(T a, T b) {
return a + b;
}
这里有几个关键点需要注意:
template<typename T>或template<class T>是模板声明,两者完全等价- T 是类型参数,代表任意数据类型
- 函数模板不是真正的函数,而是生成函数的"模具"
重要提示:函数模板的声明和定义必须放在同一个文件中,通常是头文件(.h/.hpp)。这是因为模板的实例化发生在编译期间,编译器需要看到完整的定义才能生成具体函数。
1.2 模板实例化与重载
当调用模板函数时,编译器会根据传递的参数类型自动实例化对应的函数版本。这个过程称为隐式实例化:
cpp复制cout << add(1, 2); // 实例化 add<int>
cout << add(1.5, 2.3); // 实例化 add<double>
我们也可以显式指定模板参数:
cpp复制cout << add<int>(1, 2.5); // 2.5会被截断为int
模板函数也支持重载,包括:
- 普通函数重载模板函数
- 模板函数重载模板函数
- 模板参数数量不同的重载
cpp复制// 普通函数重载
int add(int a, int b) { return a + b; }
// 模板函数重载
template<typename T1, typename T2>
auto add(T1 a, T2 b) { return a + b; }
// 参数数量不同的重载
template<typename T1, typename T2, typename T3>
T3 add(T1 a, T2 b) { return a + b; }
1.3 模板特化与偏特化
对于某些特殊类型,可能需要特殊处理,这时可以使用模板
