c++ - 第12节 - 模板进阶

news2025/1/13 7:39:12

1.非类型模板参数

模板参数分为类型形参与非类型形参
类型形参(可以认为是虚拟类型):出现在模板参数列表中,跟在class或者typename之类的参数类型名称。
非类型形参(可以认为是常量):用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。
注:
 1.模板的非类型形参可以认为是常量,在模板中不能被修改
2.浮点数、类对象以及字符串是不允许作为非类型模板参数的(非类型模板参数一般使用的都是整型,例如int、unsigned int、char)
3.非类型的模板参数必须在编译期就能确认结果 

容器array(c++11新增的容器)是一个固定大小的顺序容器,相当于定长数组。如下图所示,容器array类模板的官方库声明中,就有非类型模板参数N,N就是开辟array容器的元素个数。

array与vector相比:容器array的所有功能使用vector都可以实现。与vector有一点不同的是array里面存的就是全部的数据,数据全部存在栈里,而vector里面其实只有几个指针,vector里面的数据都存在堆里。实际中栈空间很小堆空间很大,所以vector更优。

array与原生数组相比:array其实就是封装过的原生数组,二者的区别是array对于越界的读写都可以检查出来(operator[ ]能严格检查越界),而原生数组是抽查不一定能检测出来。

总结:array对比原生数组还是有一些越界检查的优势的,但是实际中我们统一直接用vector更好。

如下图一所示代码定义一个静态栈,这样的代码有一个缺陷就是如果同时定义多个栈,这些栈的大小都是一样的。我们可以使用非类型模板参数来解决这个缺陷,灵活的控制每一个静态栈的大小。

  

2.模板的特化

2.1.概念

通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,需要特殊处理,如下图所示第一二个结果是我们所想的,但是第三个和我们预期的结果不同,其实第三个结果值是随机的,第三个这里比较的是p1和p2指针指向地址的大小,这里应该给Less函数传的是*p1和*p2,才是我们预期的结果。

但是如果一定要让你传p1和p2给Less函数,而且要实现预期的逻辑和结果,就需要用到模板的特化,即在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。模板特化中分为函数模板特化与类模板特化。

2.2.函数模板特化

函数模板的特化步骤:
1. 必须要先有一个基础的函数模板
2. 关键字template后面接一对空的尖括号<>
3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型
4. 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误 
注:其实我们也可以直接写一个现成的Less函数,这个Less函数只负责处理Date*这种类型的,这样也是可以的,如下图所示,这里Less函数模板、Less函数模板特化、Less函数是可以同时存在的,Less(p1,p2)调用的是现成的Less函数。
总结:
1.函数模板基本不用特化方式处理,直接写一个具体类型的函数更好
2.虽然函数模板可以用上面的方式直接写一个现成的函数来处理,不需要进行特化,但是类模板不能去写一个类来处理,因为函数可以重载但是类不能重载。

2.3.类模板特化

2.3.1.全特化

全特化:将模板参数列表中所有的参数都确定化,如下图所示

注:上面的全特化版本的功能简单的说就是,只要Data模板第一个参数是int第二个参数是char就走我

2.3.2.偏特化

偏特化:任何针对模版参数进一步进行条件限制设计的特化版本。
偏特化有两种表现方式:
第一种:部分特化,将模板参数类表中的一部分参数特化,如下图所示。
注:上面的这种偏特化版本的功能简单的说就是,只要Data模板第二个参数是char就走我

第二种:参数更进一步的限制,偏特化并不仅仅是指特化部分参数,而是针对模板参数更进一步的条件限制所设计出来的一个特化版本,如下图所示。

注:

1.上面的第二种偏特化版本写了指针和引用两个版本,指针版本的功能简单的说就是,只要Data模板第一个参数是指针第二个参数是指针就走我,引用版本的功能简单的说就是,只要Data模板第一个参数是引用第二个参数是引用就走我

2.上面的d9是int*和int类型,所有的特化都不匹配,因此走的是原本的Data模板

2.3.3.类模板特化应用示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/24565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

带命名空间的arxml读取

一、前言 读取带命名空间的arxml,最好的方式是创建一个字典来存放你自己的前缀并在搜索函数中使用它们: 二、解读如下ns.xml文件: <?xml version"1.0" encoding"UTF-8"?> <AUTOSAR xmlns"http://autosar.org/schema/r4.0" xmlns:xsi…

365天深度学习训练营-第7周:咖啡豆识别

目录 一、前言 二、我的环境 三、代码实现 四、VGG-16框架 五、LeNet5模型 六、模型改进 一、前言 >- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/xLjALoOD8HPZcH563En8bQ) 中的学习记录博客** >- **&#x1f366; 参考…

基于STM32G431嵌入式学习笔记——四、LED+KEY+LCD综合练习(基于第12届蓝桥杯显示部分题目)

在学习了前三节LED、LCD、KEY基本操作后&#xff0c;我们就已经成功掌握蓝桥杯必考的三大样内容了&#xff0c;本节以第12届蓝桥杯显示部分内容进行综合练习&#xff1a; 一、真题引入 1.功能概述 2.LCD显示界面 &#xff08;1&#xff09;车位显示界面 &#xff08;2&#…

PostgreSQL数据库缓冲区管理器——本地缓冲区管理

本地缓冲区管理器(local buffer manager)为temporary表&#xff08;无需WAL-logged或checkpointed&#xff09;进行快速缓冲区管理&#xff0c;API定义在src/backend/storage/buffer/localbuf.c中。 获取LocalBuffer 初始化 首先解释temp_buffers GUC参数&#xff0c;其用于…

Servlet学习日志

Hello Web Web World Wide Web 全球广域网->也称为万维网 是一种基于超文本和HTTP协议的分布式应用架构 HTML&#xff08;HyperText Mark-up Language&#xff09;:用于链接网络上的信息 HTTP协议&#xff08;HyperText Transfer Protocol&#xff09;:规定了服务端与客户…

国际海运流程有哪些,国际海运物流哪家比较好

国际海运的优点是运输费划算&#xff0c;并且可以走的货物类目多&#xff0c;合适大物件、大批的长距离运送。进出境运输工具的负责人、进出境物品的所有人或者他们的代理人向海关办理货物、物品或运输工具进出境手续及相关海关事务的过程&#xff0c;包括向海关申报、交验单据…

分析 SpringBoot 底层机制【Tomcat 启动分析 +Spring 容器初始化 +Tomcat 如何关联 Spring 容器 】

目录 一.搭建 SpringBoot 底层机制开发环境 1.pom.xml文件配置 2.springboot主程序MainApp.java 3.启动项目&#xff0c;然后我们准备开始思考 4.开始思考 底层机制分析: 仍然是 我们实现 Spring 容器那一套机制 IO/文件扫描注解反射 集合映射集合映射 二.源码分析: Spri…

DeepLab V2学习笔记

DeepLab V2遇到的相关问题以及解决方法对于DeepLab V1的优化模型总结补充的一个小知识点ASPPLearning rate policy实验结果消融实验实验结果遇到的相关问题以及解决方法 和DeepLab V1中遇到的问题几乎没有什么太大的差别&#xff0c;在文章的引言部分作者提出了在语义分割中遇…

小程序商城拓展中小商户“线上时间”,系统化思维

在数字经济时代初期&#xff0c;新一代信息基础设施建设仍有待完善&#xff0c;在拓展“互联网”应用场景中应不断缩小“数字鸿沟”&#xff0c;逐渐向产业和行业下沉&#xff0c;让互联网巨头和中小微商户共享数字技术的红利&#xff0c;也因此将推动包括传统商户在内的数字化…

政务系统信息网络安全的风险评估

在当今信息时代的大形势下&#xff0c;互联网从普及到飞速发展&#xff0c;政务系统信息网络安全的问题也日益被重视起来。一方面&#xff0c;人们应该了解到政务系统信息网络安全的重要性&#xff1b;另一方面&#xff0c;人们对政务系统信息网络安全风险评估工作有所了解。有…

公厕智能感应皂液盒,无液手机信息提醒

传统式的洗手液一按一压。有时候经常控制不住量&#xff0c;一不小心就容易按多&#xff0c;弄得洗手台乱七八糟&#xff0c;满身也是黏哒哒的&#xff0c;特别让人糟心。刚做完饭&#xff0c;满手油腻&#xff0c;或是刚上完厕所&#xff0c;去按洗手液泵势必会弄脏它。 所以智…

【Python+Appium】开展自动化测试(一)

目录 前言 一&#xff0c;安装JDK&#xff0c;配置JDK环境变量 1&#xff0c;下载jdk 2&#xff0c;安装jdk 3&#xff0c;配置jdk环境变量 二&#xff0c;安装Android SDK&#xff0c;配置Android SDK环境 1&#xff0c;下载Android SDK 2&#xff0c;双击SDK Manager…

【日常记录】解决‘GLIBC_2.34‘ not found,并且gcc制定glibc版本编译

小荣的日常记录 &#x1f525;系列专栏&#xff1a;日常记录 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月21日&#x1f334; &#x1f36d;作者水平很有限&#xff0c;如果发现错…

DETR训练自己数据集心得

对QKV的理解&#xff0c;先废一下话... 计算流程参考&#xff1a;https://zhuanlan.zhihu.com/p/82312421 给定一组query&#xff0c;和当前输入样本input&#xff08;每个样本都有各自的key&#xff09;&#xff0c;经过空间变化后input→query。 计算query和key之间的相关…

深度学习与总结JVM专辑(二):垃圾回收基础(图文+代码)

垃圾回收基础概念什么是垃圾回收为什么要进行垃圾回收垃圾什么是垃圾你是垃圾吗&#xff1f;让我用算法来测测你。引用计数算法可达性分析算法对象引用对象&#xff0c;真的死了吗方法区回收废弃常量无用类垃圾回收算法回收类型分代收集理论标记清除算法&#xff08;Mark-Sweep…

【Hack The Box】linux练习-- Irked

HTB 学习笔记 【Hack The Box】linux练习-- Irked &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1f36…

[附源码]计算机毕业设计JAVA基于ssm的电子网上商城

[附源码]计算机毕业设计JAVA基于ssm的电子网上商城 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

基于FPGA的PID控制器开发与实现

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 效果预览: 目录 一、理论基础 二、核心程序 三、测试结果

数据结构与算法之顺序表详解

标题&#xff1a;猜数字小游戏 作者&#xff1a;Ggggggtm 寄语&#xff1a;与其忙着诉苦&#xff0c;不如低头赶路&#xff0c;奋路前行&#xff0c;终将遇到一番好风景 文章目录&#xff1a; 一、顺序表的概念与结构 1、线性表的解释 2、顺序表概念解释 二、顺序表的思路及代码…

ERP系统三种部署方式的区别

ERP系统被认为是一种 "企业应用程序"&#xff0c;指的是为满足企业的软件需求和提高业务绩效而设计的软件。今天有许多不同的ERP系统可供使用&#xff0c;其范围很广&#xff0c;取决于企业的规模、功能和需求。ERP系统的类型根据其部署方式划分&#xff0c;包括云ER…