C++如何编写函数模板?(泛型编程入门)


函数模板是C++泛型编程核心,用template声明,支持自动类型推导、多参数及默认参数,但不支持偏特化,需重载或if constexpr处理特例。

函数模板是C++泛型编程的核心机制,它允许你用一套代码适配多种类型,避免重复编写相似逻辑的函数。

函数模板的基本语法

template template 声明模板参数,再定义函数。T 是占位符,编译器会在调用时自动推导实际类型。

  • typenameclass 在这里完全等价,习惯上对类型参数多用 typename
  • 模板声明必须紧邻函数定义之前,不能有空行或其它语句隔开
  • 函数体中可像使用普通类型一样使用 T,比如声明变量、作为参数或返回值类型

一个实用的交换函数模板

swap 为例,对比普通函数和模板写法:

template 
void my_swap(T& a, T& b) {
    T temp = a;
    a = b;
    b = temp;
}
  • 调用时无需显式指定类型:my_swap(x, y),编译器自动识别 x、y 的类型
  • 支持内置类型(intdouble)、自定义类(只要支持拷贝构造和赋值)
  • 若传入不同类型(如 my_swap(a, 3.14)),编译失败——模板参数 T 必须唯一确定

处理多个类型参数与默认模板参数

模板可接受多个类型参数,也可为部分参数设置默认类型:

template 
T add(const T& a, const U& b) {
    return static_cast(a + b);
}
  • 调用 add(5, 2) 时,T 和 U 都是 int;调用 add(5.5, 2) 时,T 是 double,U 是 int
  • 默认参数必须靠右,不能跳过中间参数(即不能只指定 U 而不指定 T)
  • 注意隐式转换风险,建议在关键逻辑中用 static_cast 明确类型行为

模板实参推导与显式实例化

大多数时候依赖自动推导,但某些场景需手动指定:

  • 函数参数无法提供足够信息时(如空数组、字面量类型模糊),可用 my_func(x) 显式指定
  • 显式实例化(template void my_swap<:string>(std::string&, std::string&);)可强制生成某版本代码,用于分离编译或提前检查
  • 函数模板不支持偏特化(类模板才支持),如需特殊处理某类型,应使用函数重载或 if constexpr(C++17起)


# c++  # 隐式转换  # String  # if  # int  # double  # void  # 函数模板  # 类模板  # class  # 值类型  # 函数重载  # 泛型  # 实参  # 特化  # 多个  # 都是  # 在这里  # 会在  # 而不  # 自动识别  # 自定义  # 不支持  # 为例 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Python对象比较与排序_魔术方法解析【教程】  Win10电脑怎么设置IP地址_Windows10网络属性固定IP配置  Drupal 中 HTML 链接被双重转义导致渲染异常的解决方案  PythonFastAPI项目实战教程_API接口与异步处理实践  Win11 explorer.exe频繁崩溃_修复Win11资源管理器无限重启【步骤】  如何在 IIS 上为 ASP.NET 6 应用排除特定目录并交由 PHP 处理  如何使用正则表达式精确匹配最多含一个换行符的 start-end 区段  Win10电脑怎么设置休眠快捷键_Windows10电源按钮功能定义  Windows电脑如何截屏?(四种快捷方法)  windows 10专注助手怎么关闭_windows 10禁用通知提醒功能方法  Win11如何设置省电模式 Win11开启电池节电功能【优化】  如何使用Golang实现微服务事件驱动_使用消息总线解耦服务  如何使用Golang实现RPC序列化与反序列化_Golang RPC数据编码与解码方法  Win10怎么限制单程序CPU占用上限_Win10任务管理器亲和性或第三方工具均衡负载【技巧】  php删除数据怎么清空表_truncate与delete区别及用法【汇总】  php订单日志怎么导出excel_php导出订单日志到表格教程【教程】  Win11屏幕亮度突然变暗怎么解决_自动变暗问题处理  如何使用Golang实现路由参数绑定_使用Mux和Request解析路径变量  如何解决同一段404代码在不同主机上表现不一致的问题  php下载安装后swoole扩展怎么安装_异步框架支持【汇总】  海外搜索引擎推广效果怎么样,怎么分析效果!  Win11怎么清理C盘下载文件夹_Win11清理下载文件夹技巧【教程】  如何在Golang中捕获结构体方法错误_Golang方法返回error处理实践  c# await 一个已经完成的Task会发生什么  如何使用Golang实现路由分组管理_Golang路由分组与权限控制方法  C++如何编写函数模板?(泛型编程入门)  Win11怎么开启游戏模式_Windows11优化游戏帧数设置指南  如何在 Go 中创建包含 map 的 slice(嵌套数据结构)  Win11怎么设置快速访问_Windows11文件资源管理器主页  Mac如何查看电池健康百分比_Mac系统信息电源检测  新手学PHP架构总混淆概念咋办_重点梳理【教程】  Win11怎么更改任务栏颜色_Windows11个性化重音色设置  如何使用正则表达式提取以编号开头、后接多个注解的逻辑分组块  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  php中$this和::能混用吗_对象与静态作用域冲突解决【方法】  c++中如何使用虚函数实现多态_c++多态性实现原理  英国搜索:多数英国人认为语言搜索是未来搜索  php打包exe如何加密代码_防反编译保护方法【技巧】  Win10如何更改电脑休眠时间_Windows10电源和睡眠选项调整  c++20的std::format怎么用 比printf更安全高效的格式化方法【详解】  php怎么操作Redis_Redis扩展连接与基本命令使用方法【方法】  如何使用Golang指针与接口结合_实现方法调用和动态类型  LINUX如何查看文件类型_Linux中file命令的识别与应用  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  如何在Golang中引入测试模块_Golang测试包导入与使用实践  如何使用Golang构建简易投票统计功能_Golang投票数据汇总与展示示例  如何在Golang中写入XML文件_生成符合规范的XML数据  Windows任务计划服务异常原因_任务调度失败的处理方案  Win11如何设置开机问候语 Win11修改登录界面提示【技巧】  如何开启Windows的远程服务器管理工具(RSAT)?(管理服务器) 

 2026-01-02

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.