在C++中,函数模板是一种允许函数以一种类型无关的方式来操作的工具。它们使得函数能够处理不同类型的数据而不需要为每种类型编写重复的代码。函数模板的核心思想是“参数化类型”,这意味着在定义函数时,可以使用一个或多个通用类型参数,而在函数被调用时,编译器会根据传入的实际参数类型来实例化一个具体的函数版本。
函数模板的声明以关键字template
开头,后跟模板参数列表,模板参数被封装在尖括号< >
内。模板参数通常是类型参数,使用关键字typename
或class
声明。
template <typename T>
T functionName(T parameter) {
// 函数体
}
这里,T
是一个类型占位符,代表任何数据类型。当函数被调用时,T
将被实际传入的参数类型所替代。
当函数模板被调用时,编译器自动根据传入的参数类型生成一个特定版本的函数,这个过程称为模板实例化。实例化可以是显式的,也可以是隐式的:
显式实例化:在函数调用时,开发者显式指定模板参数的类型。
functionName<int>(5); // 显式指定T为int类型
隐式实例化:编译器根据传入的参数自动推断模板参数的类型。
functionName(5); // 编译器自动推断T为int类型
以下是一个简单的函数模板示例,展示了如何定义和使用一个交换两个变量值的模板函数。
#include
using namespace std;
// 定义一个交换两个变量值的函数模板
template <typename T>
void swapValues(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
int main() {
int i = 10, j = 20;
cout << "Before swap: i = " << i << ", j = " << j << endl;
swapValues(i, j); // 隐式实例化为int类型的swapValues
cout << "After swap: i = " << i << ", j = " << j << endl;
double x = 10.5, y = 20.5;
cout << "Before swap: x = " << x << ", y = " << y << endl;
swapValues(x, y); // 隐式实例化为double类型的swapValues
cout << "After swap: x = " << x << ", y = " << y << endl;
}
这个例子中的swapValues
函数模板可以用于交换任意类型的两个变量的值,无论是整数、浮点数还是其他可以通过值复制的类型。通过使用模板,我们避免了为每种类型编写重复逻辑的需要。
#include // 包含标准输入输出流库
#include // 包含string类的定义
using namespace std; // 使用标准命名空间
// 定义一个模板函数add,接受两个同类型的参数x和y,返回它们的和。
// T是一个类型参数,表示函数可以接受任何类型的参数。
template
T add(T x, T y) {
return x + y; // 返回x和y的和。注意这要求T类型支持+操作符。
}
int main() {
// 显式实例化并调用add函数,指定类型为int。计算5 + 3的结果并打印。
cout << add(5, 3) << endl;
// 显式实例化并调用add函数,指定类型为double。计算5.3 + 7.8的结果并打印。
cout << add(5.3, 7.8) << endl;
// 再次显式实例化并调用add函数,指定类型为int。计算4 + 6的结果并打印。
cout << add(4, 6) << endl;
// 显式实例化并调用add函数,指定类型为string。将字符串"hello"和"world"相加(串联)并打印。
// 注意:在这个上下文中,+操作符被重载用于连接两个字符串。
cout << add("hello", "world") << endl;
}