当前位置: 首页 > backend >正文

【C/C++】函数模板

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

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


📌 一、什么是函数模板?

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

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


🛠️ 二、函数模板的语法

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

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

#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 的基础。加油 💪!

http://www.xdnf.cn/news/4034.html

相关文章:

  • Auto.js 脚本:清理手机数据但保留账号
  • 第R8周:RNN实现阿尔兹海默病诊断(pytorch)
  • 基于EFISH-SCB-RK3576工控机/SAIL-RK3576核心板的网络安全防火墙技术方案‌(国产化替代J1900的全栈技术解析)
  • Python生活手册-正则表达式:从快递单到咖啡订单的文本魔法
  • Level DB --- MergingIterator
  • Compose 中使用 WebView
  • 基于YOLOv的目标检测训练数据构建方法研究—图像采集、标注、划分与增强一体化流程设计
  • Softmax回归与单层感知机对比
  • 【platform push 提示 Invalid source ref: HEAD】
  • 双目视觉的核心目标
  • NGINX 的 ngx_http_auth_jwt_module模块
  • 模块方法模式(Module Method Pattern)
  • JavaScript 实现输入框的撤销功能
  • 算力经济模型推演:从中心化到去中心化算力市场的转变(区块链+智能合约的算力交易原型设计)
  • Python项目源码57:数据格式转换工具1.0(csv+json+excel+sqlite3)
  • C++ 类与对象(下)—— 进阶特性与底层机制解析(构造函数初始化,类型转换,static成员,友元,内部类,匿名对象)
  • 基于 HTML 和 CSS 实现的 3D 翻转卡片效果
  • WebRTC 服务器之SRS服务器概述和环境搭建
  • 【算法笔记】动态规划基础(二):背包dp
  • TopK题-快速选择方法
  • 数据结构实验8.1:图的基本操作
  • 联邦学习的深度解析,有望打破数据孤岛
  • 005-nlohmann/json 基础方法-C++开源库108杰
  • Sim Studio 是一个开源的代理工作流程构建器。Sim Studio 的界面是一种轻量级、直观的方式,可快速构建和部署LLMs与您最喜欢的工具连接
  • 网络安全自动化:找准边界才能筑牢安全防线
  • 数据结构中 数组、链表、图的概念
  • 深入理解CSS盒子模型
  • 如何使用QWidgets设计一个类似于Web Toast的控件?
  • 【Java ee初阶】多线程(5)
  • Electron 架构详解:主进程与渲染进程的协作机制