【C/C++】函数模板
🎯 C++ 学习笔记:函数模板(Function Template)
本文是面向 C++ 初学者的函数模板学习笔记,内容包括基本概念、定义与使用、实例化过程、注意事项等,附带示例代码,便于理解与复现。
📌 一、什么是函数模板?
函数模板是一种泛型编程方式,允许你编写与类型无关的函数代码。
作用:
写一个函数模板,可以根据不同数据类型自动生成对应的函数版本。
🛠️ 二、函数模板的语法
template <typename T>
T function_name(T arg1, T arg2) {// ... 操作 T 类型参数
}
template <typename T>
:定义模板参数 TT
是类型占位符,用于表示任意数据类型
✍️ 三、示例:加法函数模板
#include <iostream>
using namespace std;template <typename T>
T add(T a, T b) {return a + b;
}int main() {cout << add(1, 2) << endl; // 输出 3,自动推导为 intcout << add(1.5, 2.3) << endl; // 输出 3.8,自动推导为 doublecout << add<string>("Hello, ", "World!") << endl; // 字符串拼接return 0;
}
🧠 四、模板函数的实例化
模板函数在使用时才会生成具体代码,这称为“实例化”。
int result = add<int>(10, 20); // 指定类型为 int,生成 add<int>(int, int)
编译器会根据传入参数类型自动推导出 T
,也可以手动指定。
⚠️ 五、注意事项
⚠️ 问题 | 📌 说明 |
---|---|
模板不是函数声明或函数定义吗? | 模板定义本身就是声明+定义,但不会生成实际函数,直到被实例化。 |
不支持所有运算符 | 模板中的操作符必须能作用于实际类型 |
嵌套模板需注意 | 早期 C++ 中 >> 会被解析错误,C++11 后修复 |
🧪 六、示例:最大值模板
template <typename T>
T max_val(T a, T b) {return (a > b) ? a : b;
}int main() {cout << max_val(3, 7) << endl; // 输出 7cout << max_val(3.14, 2.18) << endl; // 输出 3.14
}
📚 七、模板的声明与定义分离
你可以只声明模板函数,再在别处定义(通常不推荐放在 .cpp
中,因为模板需要被编译器“看到”实现代码来实例化)。
// 声明(在头文件中)
template <typename T>
T multiply(T a, T b);// 定义(通常也放在头文件)
template <typename T>
T multiply(T a, T b) {return a * b;
}
🧩 八、函数模板与函数重载
模板函数可以和普通函数共存,编译器会优先选择普通函数,再考虑模板匹配。
int add(int a, int b) {return a + b;
}template <typename T>
T add(T a, T b) {return a + b;
}int main() {cout << add(1, 2) << endl; // 调用普通函数 add(int, int)
}
✅ 九、总结
项目 | 内容 |
---|---|
关键词 | template<typename T> |
适用场景 | 类型不确定但功能一致的函数 |
实例化时机 | 使用时才实例化 |
编译注意 | 模板定义建议放在头文件中 |
易错点 | 不能盲目使用操作符,需考虑具体类型支持 |
📌 十、推荐练习
- 写一个
min_val
模板函数 - 写一个支持任意类型求平方的
square<T>(T x)
模板函数 - 试试模板函数与普通函数共存的情况
📖 学习模板是理解 C++ 泛型编程的第一步,也是掌握 STL 的基础。加油 💪!