【C/C++】函数模板

🎯 C++ 学习笔记:函数模板(Function Template)

本文是面向 C++ 初学者的函数模板学习笔记,内容包括基本概念、定义与使用、实例化过程、注意事项等,附带示例代码,便于理解与复现。


📌 一、什么是函数模板?

函数模板是一种泛型编程方式,允许你编写与类型无关的函数代码。

作用:

写一个函数模板,可以根据不同数据类型自动生成对应的函数版本。


🛠️ 二、函数模板的语法

cpp 复制代码
template <typename T>
T function_name(T arg1, T arg2) {
    // ... 操作 T 类型参数
}
  • template <typename T>:定义模板参数 T
  • T 是类型占位符,用于表示任意数据类型

✍️ 三、示例:加法函数模板

cpp 复制代码
#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,自动推导为 int
    cout << add(1.5, 2.3) << endl;     // 输出 3.8,自动推导为 double
    cout << add<string>("Hello, ", "World!") << endl;  // 字符串拼接
    return 0;
}

🧠 四、模板函数的实例化

模板函数在使用时才会生成具体代码 ,这称为"实例化"。

cpp 复制代码
int result = add<int>(10, 20);   // 指定类型为 int,生成 add<int>(int, int)

编译器会根据传入参数类型自动推导出 T,也可以手动指定。


⚠️ 五、注意事项

⚠️ 问题 📌 说明
模板不是函数声明或函数定义吗? 模板定义本身就是声明+定义,但不会生成实际函数,直到被实例化。
不支持所有运算符 模板中的操作符必须能作用于实际类型
嵌套模板需注意 早期 C++ 中 >> 会被解析错误,C++11 后修复

🧪 六、示例:最大值模板

cpp 复制代码
template <typename T>
T max_val(T a, T b) {
    return (a > b) ? a : b;
}

int main() {
    cout << max_val(3, 7) << endl;        // 输出 7
    cout << max_val(3.14, 2.18) << endl;  // 输出 3.14
}

📚 七、模板的声明与定义分离

你可以只声明模板函数,再在别处定义(通常不推荐放在 .cpp 中,因为模板需要被编译器"看到"实现代码来实例化)。

cpp 复制代码
// 声明(在头文件中)
template <typename T>
T multiply(T a, T b);

// 定义(通常也放在头文件)
template <typename T>
T multiply(T a, T b) {
    return a * b;
}

🧩 八、函数模板与函数重载

模板函数可以和普通函数共存,编译器会优先选择普通函数,再考虑模板匹配。

cpp 复制代码
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 的基础。加油 💪!

相关推荐
GUIQU.6 分钟前
【QT】嵌入式开发:从零开始,让硬件“活”起来的魔法之旅
java·数据库·c++·qt
西阳未落4 小时前
C++基础(21)——内存管理
开发语言·c++·面试
超级大福宝4 小时前
使用 LLVM 16.0.4 编译 MiBench 中的 patricia遇到的 rpc 库问题
c语言·c++
wangjialelele4 小时前
Linux中的线程
java·linux·jvm·c++
hsjkdhs6 小时前
万字详解C++之构造函数析构函数
开发语言·c++
SELSL6 小时前
SQLite3的API调用实战例子
linux·数据库·c++·sqlite3·sqlite实战
什么半岛铁盒7 小时前
C++项目:仿muduo库高并发服务器-------Channel模块实现
linux·服务器·数据库·c++·mysql·ubuntu
闭着眼睛学算法7 小时前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od
ShineSpark7 小时前
C++面试11——指针与引用
c++·面试
杨小码不BUG8 小时前
CSP-J/S初赛知识点精讲-图论
c++·算法·图论··编码·csp-j/s初赛