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

【C++】--模板进阶

一、非类型模板参数

前面我们在模板初阶的时候,我们在使用模板的时候都是对数据类型进行模板化的操作的。

那么啥是非类型模板参数呢?

就比如说我们要设计一个栈,那么我们要初始化数组的大小,那么我们可以定义一个宏来初始化数组的大小。我们使用一个N来定义。

但是我们会发现我们使用栈的时候,有的时候需要大一点的空间,有时候需要小一点的空间,那么我们要是经常修改这个N,就显得很不方便了。

在C++中,模板中有一个非类型模板参数,其可以设计成一个确定的数据类型,然后可以实现我们宏的一些功能。

我们在使用的时候就要传两个参数了。

那么这样操作,我们就又发现,这和我们自己手动去设置数组的大小不是一样的吗?

那么我们为啥要去这么写,这不是多此一举吗?
我们前面提到了,我们的数组的越界访问检查是随机的,并不是一定可以检查出来的,但是我们在类模板中使用的话其越界读写都可以检查出来。

所以我们对于这边就更推荐使用模板来操作了。

下面是我们使用非类型模板参数要注意的:

1、非类型模板参数在编译的使用就会将类中的参数进行替换

2、非类型模板参数可以给缺省值

3、浮点数,类和对象还有字符串不可以作为非类型模板参数。到C++20的时候才支持。

二、模板特化

我们使用模板的时候,是想其脱离数据类型,实现我们的逻辑。但是对于一些特殊的数据类型,我们进逻辑运算的时候,其逻辑是比较特殊的,所以我们特殊处理,比如说我们实现一个比较大小的函数:

上面的这个比较函数的使用,要是我们传入的是指针的话,那么其结果就不会是我们预期那样,这是因为我们想的是指针指向的内容进行比较,而其实际上比较的是指针的地址了,那么我们要针对这种情况写一个比较逻辑,使得其是对指针指向的内容进行比较的。

那么这种情况下,我们就要对模板进行一个特化,这个是一个特殊化的处理,就在原来的模板下,针对某种特殊的数据类型进行特殊化的实现,然后模板的特化又分为函数模板特化和类模板特化。

函数模板特化:

函数模板特化的步骤如下:

1、要先有一个基础的函数模板,我们上面的Less函数就有了

2、关键字tempalte后面加一个空的<>

3、函数名后加一个<>,然后<>中指定要特化的类型

4、函数形参表:要和原函数模板的参数类型一样,要是不一样编译器就会报错,而且报错信息会       特别长。

下面是我们函数模板特化的实例:

我们前面学习模板的时候,我们讲过编译器在函数调用的时候,有现成的会用现成的,那么我们模板特化也是一样,其会先找有没有对应的数据类型的,然后再调用基础函数模板。

但是对于这种简单的函数,我们就直接写一个现成的函数即可。

这样代码的可读性也高。

对于函数模板特化我们不太建议。

三、类模板特化

类模板特化分为两种,一种是全 特化,一种是偏特化。

1、全特化:

全特化就是模板参数中的所有参数都指定类型。

不过要注意的是要先有一个基础函数。

可以看到其在调用的时候有匹配的会优先调用全特化的模板。

2、偏特化

偏特化就是对于部分的参数进行特化。

如上所示,我们对第二个参数进行特化,那么我们实例化调用的时候也是会优先调用匹配的。

然后我们还可以将参数限制为指针,引用这样。

四、模板分离编译

前面我们写stl的时候,我们会发现我们带模板的时候就都不会将其分离在两个文件中,这是因为我们的文件的编译分为预处理,编译,汇编,链接几个过程,然而每个过程每个源文件都是单独进行的,所以这样分离会导致另外一个文化在编译的时候找不到目标函数,这是因为我们模板在没有实例化的时候,实际上是不存在的。

下面我们来详细解释一下模板分离编译的问题:

比如我们现在有三个文件:

Func.h、Func.cpp、test.cpp.

那么其只有在链接后才会有联系。

所以我们推荐:

1、模板的声明和定义放在一个文件中。

2、在模板定义的地方进行显示实例化,但是这样又和我们模板设计的初衷有点背离,所以我们还       是推荐将其放在一个文件中。

http://www.dtcms.com/a/597877.html

相关文章:

  • 如何选择企业网站建设wordpress 自动跳转
  • 设计深圳网站制作新北方app下载
  • 【Janet】函数
  • 【微服务 - easy视频 | day04】Seata解决分布式事务
  • 网站关键词没有排名怎么用ip做网站
  • Jmeter超详细使用教程
  • 北京网站优化技术学科分类目录
  • 网站源码下载安全吗找一个免费域名的网站
  • 【Git、GitHub、Gitee】GitLab的概念、注册流程、远程仓库操作以及高级功能详解(超详细)
  • 2025三掌柜赠书活动第四十一期 AI Agent 开发实战:MCP+A2A+LangGraph 驱动的智能体全流程开发
  • 1 NLP导论及环境准备
  • 龙岩做网站开发大概价格网页软件有哪些
  • 设计软件网站wordpress付费看
  • C#中,FirstOrDefault
  • 【INVSR 代码解析】encode_first_stage函数,以及一个知识点普通编码器与VAE编码器的区别
  • 面试题:说说Redis的三大问题和解决方案
  • 大型企业网站wordpress评论框制作
  • EtherCAT通信PDO和SDO的区别和使用
  • dedecms本地可以更换网站模板出现网站模板不存在3800给做网站
  • 漯河哪里做网站柳州市住房和城乡建设局网站首页
  • 50m专线做视频网站asp网络公司程序 网站公司企业建设源码 网站设计模板seo优化
  • 企业年底做网站的好处做正品的网站
  • LeetCode 84. 柱状图中最大的矩形(困难)
  • YOLOv2算法详解(下篇):细节打磨与性能突破的终极密码
  • 算法 day 51
  • BI二维数据可视化大屏升级三维可视化大屏:前端开发者下一个内卷赛道
  • 插补算法(逐点比较法)+PWM配置操作
  • 唐山网站制作app新郑市网站建设
  • 买完阿里云域名如何做网站网站商业授权
  • QEMU 使用 Open vSwitch网桥连接虚拟机网络