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

C++初阶 模版进阶

一.非类型模版参数

模板参数分类类型形参与非类型形参。

类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。

非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。

类型模版参数

这里的 T 代表一种类型,比如 int、double、char。

非类型模版参数

这里的 N 不是类型,而是一个整数常量。

这里 10、20 就是非类型模板参数。

注意:Array<10> 和 Array<20> 是两个不同的类型。

常见用途是固定容量数组

T 是类型模板参数,表示数组元素类型。

N 是非类型模板参数,表示数组大小。

非类型模板参数必须是编译期常量:

正确写法:

注意: 浮点数、类对象以及字符串是不允许作为非类型模板参数的

二.模版的特化

1.概念

通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,需要特殊处理

对于

都没问题

但是有时候某个类型需要特殊处理

如果直接:

比较的是地址,而不是字符串内容。

这时候就需要对 char* 单独处理。

2.函数模版特化

函数模板的特化步骤:

1. 必须要先有一个基础的函数模板

2. 关键字template后面接一对空的尖括号<>

3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型

4. 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。

特化后:

输出: 1

注意:一般情况下如果函数模板遇到不能处理或者处理有误的类型,为了实现简单通常都是将该函数直接给出。

再保留原模版

编译器会优先匹配:

不会去实例化模板。

3.类模版特化

全特化

普通模版

专门针对 int

输出: 普通模板

int特化版本

这里

已经把所有模板参数都确定了

所以叫全特化

双参数类模板

都属于普通模板

偏特化

情况1:固定一个参数

输出: 第二个参数为int

这里T1 仍然可以变化

都能匹配。

因此只固定了一部分参数。

叫偏特化

情况2:固定第一个参数

输出: 第一个参数为int

指针偏特化

输出: 普通版本

指针版本

指针版本

引用偏特化

输出:引用版本

三.模板分离编译

1.什么是模板分离编译

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式

2.模版分离编译

模板的声明和定义不能像普通函数一样随便分开放在 .h 和 .cpp 里。

因为模板不是普通代码,它需要在编译期根据具体类型实例化。

如果你把实现写到 .cpp:

然后在 main.cpp 里使用:

这时候可能会链接错误。

原因是:main.cpp 只看到了模板声明:

但看不到模板定义

所以编译器无法在 main.cpp 中实例化出:

而 Stack.cpp 虽然有模板定义,但它没有使用:

所以它也不会生成 Stack<int>::Push 的具体代码。

最后链接时就会报:

也就是:找不到函数实现。

3.解决方法

1.声明和定义都放在头文件里

或者类内声明,类外定义,但都写在 .h 里:

这样 main.cpp 包含头文件后,既能看到声明,也能看到定义,就可以实例化模板。

2.显式实例化

如果你明确知道只会用某几个类型,比如只用 int 和 double,可以这样写。

这样可以

但如果你用

就不行,因为 .cpp 里没有显式实例化:

四.模板总结

优点:

1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生

2. 增强了代码的灵活性

缺陷:

1. 模板会导致代码膨胀问题,也会导致编译时间变长

2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误

http://www.gsyq.cn/news/1424616.html

相关文章:

  • NTU、HKU等多所顶校联手,让AI同时“多角度看片“
  • AI Agent Harness Engineering 创业风险规避:市场、技术与政策的潜在坑点
  • 别再死磕理论了!用Python+PyTorch实战MAPPO,搞定多智能体协同控制(附完整代码)
  • 【Leetcode】231. 2的幂
  • TranslucentTB:Windows任务栏透明化终极指南与完整解决方案
  • 西湖大学等机构联手破解AI图像生成的“翻译失真“难题
  • 保姆级教程:在Ubuntu 20.04上从源码编译运行FAST-LIO2(避坑指南)
  • 2026年成都店面设计装修品牌实测评测对比 - 优质品牌商家
  • 【Lindy自动化黄金配置清单】:12项必检参数+3类高危人工干预场景预警
  • β-PPH管与其他管道性能全对比
  • 2026年当下吉林学摄影课程哪家?深度剖析沈阳爱玲化妆摄影培训学校 - 2026年企业资讯
  • 内存计算技术:突破数据移动瓶颈的新范式
  • 别再手动调参了!用MATLAB的自动超参数优化,5分钟搞定LSBoost和Bagging回归模型
  • 2026成都长途搬家品牌选择:核心技术维度实测推荐 - 优质品牌商家
  • 告别论文焦虑:6款2026年优质AI论文写作软件深度横评
  • Redis在线学习终极指南:3分钟零配置掌握数据库核心操作
  • 手把手教你用Python处理Weibo虚假新闻检测数据集(附完整代码与图片爬虫)
  • 2026 年口碑佳的基层治理数智平台服务商在哪?
  • ThinkBook 14换装Ubuntu:双系统/单系统安装与驱动避坑全记录(附MT7921网卡解决方案)
  • GPT-5.5:面向下一代智能应用的技术展望
  • 避坑指南:处理汽油需求数据时,FGLS估计结果反而变差?聊聊自相关校正的陷阱
  • 避坑指南:RNA-seq做PCA分析时,为什么你的样本分不开?从数据预处理到结果解读
  • 功率线与信号线共模电感的核心区别
  • 井下做业实景透明.智能预警透明化三维立体重构AI预判安全治理
  • 告别ifconfig:SUSE 15 SP5最小化安装后的网络配置与基础软件包选择实战
  • macOS微信防撤回终极方案:WeChatIntercept技术解析与部署指南
  • 避开这些坑!Windows 10/11系统下MIL安装与GigE Vision驱动选择全攻略
  • Windows7虚拟机装不上VMware Tools?别急,一个SHA2补丁就能搞定(附KB4474419下载安装保姆级教程)
  • 别再纠结选Lasso还是Ridge了:用Python手把手教你调Elastic Net的λ和ρ参数
  • 五一数学建模B题复盘:用Python搞定快递需求预测与成本优化(附完整代码)