C++如何编写函数模板?(泛型编程入门)
技术百科
裘德小鎮的故事
发布时间:2026-01-02
浏览: 次 函数模板是C++泛型编程核心,用template声明,支持自动类型推导、多参数及默认参数,但不支持偏特化,需重载或if constexpr处理特例。
函数模板是C++泛型编程的核心机制,它允许你用一套代码适配多种类型,避免重复编写相似逻辑的函数。
函数模板的基本语法
用 template
- typename 和 class 在这里完全等价,习惯上对类型参数多用 typename
- 模板声明必须紧邻函数定义之前,不能有空行或其它语句隔开
- 函数体中可像使用普通类型一样使用 T,比如声明变量、作为参数或返回值类型
一个实用的交换函数模板
以 swap 为例,对比普通函数和模板写法:
templatevoid my_swap(T& a, T& b) { T temp = a; a = b; b = temp; }
- 调用时无需显式指定类型:my_swap(x, y),编译器自动识别 x、y 的类型
- 支持内置类型(int、double)、自定义类(只要支持拷贝构造和赋值)
- 若传入不同类型(如 my_swap(a, 3.14)),编译失败——模板参数 T 必须唯一确定
处理多个类型参数与默认模板参数
模板可接受多个类型参数,也可为部分参数设置默认类型:
templateT 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
# 值类型
# 函数重载
# 泛型
# 实参
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Python网络日志追踪_请求定位解析【教程】
- c++的mutex和lock_guard如何使用
- Mac如何修改Hosts文件?(本地开发与屏蔽网站
- Windows10电脑怎么连接蓝牙设备_Win10
- Win11局域网共享怎么设置 Win11文件夹网络
- c++ stringstream用法详解_c++字
- Windows10系统怎么查看CPU核心数_Win
- c# 如何深拷贝和浅拷贝
- Win11如何设置系统语言_Win11系统语言切换
- Python文件操作优化_大文件与流处理解析【教程
- 如何快速验证Golang安装是否成功_运行go v
- php8.4如何配置ssl证书_php8.4htt
- Windows11怎么自定义任务栏_Windows
- Win11怎么设置虚拟键盘_打开Win11屏幕键盘
- mac怎么安装adb_MAC配置Android A
- Python与MongoDB NoSQL开发实战_
- win11 OneDrive怎么彻底关闭 Win1
- 微信短链接怎么还原php_用浏览器开发者工具抓包获
- php打包exe后无法写入文件_权限问题解决方法【
- php内存溢出怎么排查_php内存限制调试与优化方
- 如何在 Go 中调用动态链接库(.so)中的函数
- Windows7怎么找回经典开始菜单_Window
- Win10如何备份驱动程序_Win10驱动备份步骤
- Windows10如何删除Windows.old_
- Win10怎么关闭自动更新错误弹窗_Win10策略
- Windows Defender扫描失败怎么办_安
- Win11色盲模式怎么开_Win11屏幕颜色滤镜设
- php8.4如何实现队列任务_php8.4redi
- PHP的FastAdmin架构适合二次开发吗_特点
- PHP 中 require() 语句返回值的用法详
- Mac怎么给文件夹加密_Mac创建加密磁盘映像教程
- c++中的Tag Dispatching是什么_c
- 如何在Golang中使用encoding/gob序
- MAC怎么解压RAR格式文件_MAC第三方解压工具
- PHP的Workerman对架构扩展有啥帮助_应用
- Go 中 defer 语句在 goroutine
- C#怎么使用委托和事件 C# delegate与e
- Windows10如何更改计算机工作组_Win10
- 如何在 Go 结构体中正确初始化 map 字段
- Win11怎么更改鼠标指针_Windows 11自
- VSC里PHP变量未定义报错怎么解决_错误抑制技巧
- Win10电脑怎么设置IP地址_Windows10
- Win11怎么恢复旧版开始菜单_通过软件还原Win
- Win11怎么快速锁屏_Win11一键锁屏快捷键W
- 如何使用Golang编写单元测试_创建Test函数
- Windows蓝屏错误0x0000002C怎么解决
- 如何在JavaScript中动态拼接PHP的bas
- Windows如何使用BitLocker To G
- 如何在Golang中捕获JSON序列化错误_Gol
- php怎么连接数据库_MySQL数据库连接的基础代

可用 my_func
QQ客服