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; ?>
】
相关推荐
- Win11怎么清理C盘虚拟内存_Win11清理虚拟
- 如何在Golang中处理云原生事件_使用Event
- 如何在Golang中处理URL参数_Golang
- C++如何使用std::async进行异步编程?(
- 如何在Golang中使用闭包_封装变量与函数作用域
- c++ try_emplace用法_c++ map
- PHP怎么接收URL中的锚点参数_获取#后面参数值
- php条件判断怎么写_ifelse和switchc
- Win11怎么设置任务栏对齐方式_Windows1
- 如何在 Go 中判断变量是否为函数类型
- Windows10电脑怎么设置文件权限_Win10
- 如何在Golang中实现邮件发送功能_Golang
- Win11怎么更改计算机名_Windows11系统
- 本地php环境打开php文件直接下载_浏览器解析p
- C++如何解析JSON数据?(nlohmann/j
- mac怎么查看wifi密码_MAC查看已连接WiF
- c# 在高并发场景下,委托和接口调用的性能对比
- Windows10如何彻底关闭自动更新_Win10
- c++的mutex和lock_guard如何使用
- 如何理解Go指针和内存分配关系_Go Pointe
- Windows服务启动类型恢复方法_错误修改导致的
- Win11用户账户控制怎么关_Win11关闭UAC
- 如何使用Golang log记录不同级别日志_Go
- c++20的std::format怎么用 比pri
- Win11如何更改用户账户文件夹名称 Win11修
- Win11怎么开启游戏模式_Windows11优化
- Win11截图快捷键是什么_Win11自带截图工具
- 如何解决Windows字体显示模糊的问题?(Cle
- 如何在 Go 中创建包含 map 的 slice(
- Win11怎么设置快速访问主页_Windows11
- windows系统找不到无线网络怎么办_windo
- Win11玩游戏全屏闪退怎么办_Win11全屏优化
- Go 中 defer 在 goroutine 内部
- Python函数接口文档化_自动化说明【指导】
- Win11怎么设置任务栏图标大小_Windows1
- Win11怎么设置单手模式_Win11触控键盘布局
- Win11怎么退出微软账户_切换Win11为本地账
- Windows10无法连接到Internet_Wi
- Win11怎么开启移动热点_Windows11共享
- C++中的协变与逆变是什么?C++函数指针与返回类
- Windows11如何设置专注助手_Windows
- PHP cURL GET请求:正确设置认证与自定义
- Windows11怎么自定义任务栏_Windows
- MAC如何修改默认应用程序_MAC文件后缀关联设置
- 如何在Golang中使用log包输出不同级别日志_
- Windows系统文件被保护机制阻止怎么办_权限不
- Windows10如何更改系统字体大小_Win10
- 如何在 Go 中正确测试带 Cookie 的 HT
- Win11怎么打开注册表_Windows 11注册
- php485函数执行慢怎么优化_php485性能提

可用 my_func
QQ客服