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

C++ Template 基础篇(一):函数模板

C++ Template 基础篇(一):函数模板
(2025–2026 年最实用、最清晰的入门讲解)

函数模板是 C++ 模板机制的入门级也是最常用的部分。
掌握函数模板后,你就能写出类型无关复用性极高的代码,这是现代 C++(尤其是泛型编程)的基石。

1. 什么是函数模板?

一句话定义

函数模板 = “写一次函数,让编译器根据调用时的参数类型自动生成多个具体版本的函数”

换句话说:你只写一份代码,编译器帮你生成 int 版、double 版、string 版、自定义类版…… 所有需要的版本。

2. 最经典的例子:求最大值

传统写法(重复劳动)

intmax(inta,intb){returna>b?a:b;}doublemax(doublea,doubleb){returna>b?a:b;}longlongmax(longlonga,longlongb){returna>b?a:b;}// …… 每种类型都要写一遍,太痛苦

用函数模板(一次编写,到处使用)

template<typenameT>// 或 template <class T>(两者等价)Tmax(T a,T b){returna>b?a:b;}

使用方式:

intmain(){cout<<max(3,7)<<endl;// 调用 int 版本cout<<max(2.5,1.8)<<endl;// 调用 double 版本cout<<max(100LL,200LL)<<endl;// 调用 long long 版本string s1="apple",s2="banana";cout<<max(s1,s2)<<endl;// 调用 string 版本(按字典序比较)}

编译器在编译时会自动为每种调用生成一份具体函数(称为模板实例化)。

3. 模板语法核心关键词

写法含义现代推荐写法(C++11+)
template <typename T>T 是类型参数推荐(最清晰)
template <class T>与上面完全等价历史写法,仍合法
template <typename T1, typename T2>多个类型参数常见于 map、pair 等
template <int N>非类型参数(常量)后面会讲

4. 函数模板的推导规则(最容易出错的地方)

编译器如何决定 T 是什么?

规则总结(优先级从高到低):

  1. 显式指定类型(最强,强制使用)
max<double>(3,4.5);// 强制 T = double,3 会被隐式转换为 double
  1. 根据实参自动推导(最常见)
max(10,20);→ T=intmax(1.2f,3.4);→ T=float
  1. 常见陷阱:不同类型实参时推导失败
max(10,3.14);// 错误!编译器不知道 T 应该是 int 还是 double

解决办法(三种任选):

// 方案1:显式指定max<double>(10,3.14);// 方案2:统一类型max(10.0,3.14);// 方案3:重载或使用模板重载(后面会讲)

5. 模板函数的重载特化

模板函数也可以和普通函数、其他模板函数一起重载。

// 普通函数(优先级最高)intmax(inta,intb){cout<<"调用普通函数\n";returna>b?a:b;}// 模板函数template<typenameT>Tmax(T a,T b){cout<<"调用模板\n";returna>b?a:b;}// 调用max(5,3);// → 调用普通函数(非模板函数优先)max(5.0,3.0);// → 调用模板(没有匹配的普通函数)

模板特化(针对特定类型写特殊版本)

// 针对 const char* 的特化版本(字符串比较用 strcmp)template<>constchar*max<constchar*>(constchar*a,constchar*b){returnstrcmp(a,b)>0?a:b;}

6. 非类型模板参数(C++11 前就存在,很实用)

template<intN>voidprint_fixed_size_array(int(&arr)[N]){for(inti=0;i<N;++i){cout<<arr[i]<<" ";}}intmain(){inta[5]={1,2,3,4,5};print_fixed_size_array(a);// N 自动推导为 5}

7. 2026 年写函数模板的现代最佳实践

// 推荐写法(C++20 概念 + auto 参数)#include<concepts>// 要求 T 支持 < 运算符template<typenameT>requiresstd::totally_ordered<T>// C++20 概念约束Tmy_max(T a,T b){returna<b?b:a;}// 更现代:C++20 缩写语法automy_max(std::totally_orderedautoa,std::totally_orderedautob){returna<b?b:a;}

8. 小结:函数模板一句话记住

函数模板让你写一份代码,编译器自动生成 N 份类型特化的函数。

核心口诀

  • template <typename T>开头
  • T 代表“任意类型”
  • 编译器在调用时自动推导或显式指定 T
  • 重复参数类型自动去重,优先匹配普通函数
  • 想限制类型 → 用 C++20 概念(requires)

下一篇文章可以继续讲:

  • 类模板(class template)
  • 模板特化 & 偏特化
  • 变参模板(variadic template)
  • C++20 概念(concepts)实战

你想现在就继续看“类模板”还是先做几个函数模板练习题?或者有具体的使用场景(排序、比较、打印容器等)想看示例?告诉我,我立刻写给你。

http://www.jsqmd.com/news/428851/

相关文章:

  • [AI智能体与提效-116] - OpenAI API用法:Completions创建聊天对话
  • 使用矢量网络分析仪(VNA)测试汽车保险杠与车标雷达透波性能
  • Vue3 整合 Pinia 和 Vue Router
  • 2026年 堵漏工程厂家实力推荐榜:专业解决地下室/隧道/大坝等各类防水堵漏难题,精选优质服务商 - 品牌企业推荐师(官方)
  • 锁相放大器SR865A与SR860选型指南
  • 2026年厂房、餐饮、店铺及多元商业空间装修专业选型指南:聚焦靓滔装饰与思嫒装潢 - 品牌推荐官
  • 2026年诚信型会议预约系统优质推荐榜:工位系统服务商/工位系统订做研发公司/访客系统订研发公司/选择指南 - 优质品牌商家
  • 2026年无锡网站建设与外贸推广服务商推荐榜:专业SEO优化、宣传片拍摄及小程序开发一站式解决方案 - 品牌企业推荐师(官方)
  • 矢量网络分析仪E5080B使用说明
  • 2026年靠谱装修公司选择指南:老房翻新/工装/高端别墅场景下的头部品牌测评与选型建议 - 博客万
  • 基于51单片机的声光控制开关设计
  • 2026 日本展台设计搭建公司甄选:和风科创筑展,精益适配点亮会展新场景 - 资讯焦点
  • 基于单片机的智能抢答器设计
  • 2026年篮球架厂家推荐:纽戈(上海)实业有限公司专业供应移动/箱式/悬挂式/成人/室外全系产品 - 品牌推荐官
  • 2026 日本展厅设计搭建公司优选:和风长效筑馆,精益科创赋能品牌展厅 - 资讯焦点
  • div设置超出文本换行
  • 2026年变压器厂家推荐排行榜:干式/油浸式/光伏/充电桩变压器,S20/S22一级能耗及SCB14/SCB18干式变压器实力品牌深度解析 - 品牌企业推荐师(官方)
  • Temu合规标签模板制作要求有哪些?Temu合规标签模板制作步骤详解! - 跨境小媛
  • 圆形逆流冷却塔哪家强?2026年推荐这几家靠谱公司,闭式冷却塔/圆形逆流冷却塔,圆形逆流冷却塔供货厂家推荐 - 品牌推荐师
  • See Dance 2.0:新时代的产物
  • 基于矢量网络分析仪的总谐波失真(THD)测量方法简析
  • 加急办理:邓白氏编码3-6天闪电出码的专业代理公司机构盘点 - 速递信息
  • 零基础入门 Spring Boot:从“Hello World”到可上线的 Web 应用(小白友好全链路指南)
  • VLOOKUP函数使用方法大全总结
  • 2026年研磨仪市场大调查:全球与中国市场占有率TOP5品牌深度解析 - 品牌推荐大师1
  • 2026年 花辊雕刻机厂家推荐排行榜:专业雕刻设备,涵盖对压辊、压花辊、模切辊、刀模花辊、超声波辊、干燥造粒辊、圆柱、立式、模具及金属辊雕刻机 - 品牌企业推荐师(官方)
  • 惠州搬家服务公司、惠州设备搬迁公司、惠州货物搬运搬迁公司、惠州附近搬家公司、深圳仓库搬家公司、深圳仓库搬迁公司选择指南 - 优质品牌商家
  • 为什么央视都说了网络安全的人才缺口巨大,但还是有很多人找不到工作,难道又被专家忽悠了?
  • Vue3 Composables (逻辑复用)
  • 2026年 净化铝材/FFU龙骨/不锈钢防水槽/机电设备减震器厂家推荐榜单:洁净工程核心构件实力供应商深度解析 - 品牌企业推荐师(官方)