模板进阶【C++】

news2024/11/16 1:47:43

文章目录

  • 模板的特殊化
      • 函数模板特化的作用
    • 函数模板的的特殊化
      • 语法:
      • 函数模板特化的要求
    • 类模板的特殊化
      • 类模板的特殊化的要求
      • 类模板的特殊化的语法
      • 全特化
      • 偏特化
        • 实例化部分模板参数
        • 对基本类模板(母板)的模板参数进行限制
  • 非类型模板参数
    • 非类型模板参数的特点(注意点)

模板的特殊化

模板的特化是对已经存在的模板进行的特殊处理

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

例如
写一个比较函数,如果是直接写成下图的函数模板,我们就只能按照规定好的大小比较方式进行比较
在这里插入图片描述

上图的比较虽然按照语法来说是正确的

但是如果我们想写一个当传入的参数的类型是int*的时候,比较的方式是指针解引用之后再比较的话,如果只有上图中的模板就做不到了

这个时候就可以对特殊化出一个模板,专门处理我们的特殊要求
在这里插入图片描述
可以看到,这样就完成了我们的对int*类型特殊处理的要求


函数模板特化的作用

作用很简单:
传入的具体类型如果拥有对应的特化模板函数,就会优先调用那个特化的模板函数

例如上面举例的比较大小的模板函数Greater,如果传给Greater的参数类型是int*,那就会优先调用int*特化的模板函数

因为函数模板特化的作用基本只有这个,所以其实函数模板的特化是有替代的,那就是普通的函数没错就是普通的函数,模板初阶【模板初阶【C++】】中就说过,如果既有函数模板又有普通函数时,在传递参数都不会类型转换的情况下,编译器就会优先调用普通函数


在这里插入图片描述
在这里插入图片描述

所以其实函数模板的特化其实挺鸡肋的,因为直接写成普通函数还更好

  1. 因为它的语法限制比普通函数多
  2. 在函数模板特化和普通函数共存时,甚至还会优先调用普通函数

但是类模板的特化就有用得多了


函数模板的的特殊化

语法:

template<>
返回值 函数名<具体类型,具体类型,……>(参数表)
{
    函数体
}


在这里插入图片描述
具体类型就是要特殊处理的类型【特化类型】


函数模板特化的要求

  1. 因为模板的特化是对已经存在的模板进行的特殊处理
    所以必须要先有一个基础的函数模板(母板),才能对这个模板进行特殊化
  2. 关键字template后面的尖括号<>里面一定得是空的,这是语法规定,不是空的就报错
    在这里插入图片描述
  3. 特化的模板函数的参数表: 必须要和基础的函数模板(母板)的参数完全相同
    人话:写出来的特化的模板函数的参数表,与把特化类型传给基础的函数模板(母板)后实例化出来的模板函数的参数表一样
    不然可能会出现很多奇怪的错误,此时要是实在解决不了,就直接实现成全局函数就行了
    在这里插入图片描述

类模板的特殊化

类模板的特殊化的要求

因为:模板的特化是对已经存在的模板进行的特殊处理

和函数模板一样,必须要先有一个基础的类模板(母板),才能对这个类模板进行特殊化


类模板的特殊化的语法

template<空 或者 模板参数,模板参数,……>
class 类名<具体类型/加上限制的模板参数>
{
    类体
}

全特化

全特化就是把基本类模板(母板)的模板参数全部实例化

在这里插入图片描述
全特化了之后,当传给类模板的参数和全特化的模板实例化的参数完全相同的时候,就会调用全特化的类模板实例化对象

如下图:
在这里插入图片描述


偏特化

偏特化分两种:

实例化部分模板参数

这样偏特化了之后,传给类模板的参数和偏特化的类模板部分实例化的参数完全相同的时候,就会调用偏特化的类模板进行实例化对象


如下图,当传给A类的模板参数,第一个是int时将会调研偏特化的类模板实例化对象
第一个模板参数不是int的时候,才会调用基本类模板(母板)进行实例化对象
在这里插入图片描述


对基本类模板(母板)的模板参数进行限制

不实例化基本类模板(母板)的模板参数,而是对它加上限制【加const*{指针限制}&(引用限制)等】

这样偏特化了之后,传给类模板的参数和偏特化限制的参数完全相同的时候,就会调用偏特化的类模板进行实例化对象

如下图,偏特化加上的限制是*{指针限制},所以如果传给类模板的模板参数都是指针类型的就会调用偏特化的类模板进行对象的实例化
实例化c对象的时候传给类模板的模板参数都是指针类型,所以调用了偏特化的类模板
实例化b对象的时候传给类模板的模板参数只有第一个是指针类型,并没有与偏特化限制的参数完全相同,所以调用的还是基本类模板(母板)
在这里插入图片描述


非类型模板参数

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

例如:
自己封装一个静态数组,此时就可以用非类型模板参数作为静态数组的容量大小
在这里插入图片描述


非类型模板参数的特点(注意点)

  1. C++20以前非类型模板参数的类型只能是整型或者char类型

  2. C++20以后非类型模板参数的类型支持所有内置类型,但不能是自定义类型

  3. 非类型模板参数可以给缺省值

  4. 因为非类型模板参数是常量,所以它接收的参数也必须是常量或者是const修饰的变量

    在这里插入图片描述
    传变量就会报错
    在这里插入图片描述


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

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

相关文章

ESP32低功耗蓝牙服务端的库介绍和实例演示

ESP32低功耗蓝牙服务端的库介绍和实例演示 1.概述 前面的文章介绍了经典蓝牙库和使用示例&#xff0c;这篇文章介绍低功耗蓝牙库的使用。 这篇文章不介绍低功耗蓝牙实现的架构知识&#xff0c;只介绍 如何使用它的库文件实现应用开发只介绍服务端蓝牙开发方式 2.低功耗蓝牙…

R语言大尺度空间数据分析模拟预测及可视化:地统计与空间自相关、空间数据插值、机器学习空间预测、空间升降尺度、空间模拟残差订正、空间制图等

目录 专题一 R语言空间数据介绍及数据挖掘关键技术 专题二 R语言空间数据高级处理技术 专题三 R语言多维时空数据处理技术、数据清洗整合和时间序列分析 专题四 R语言地统计与空间自相关、空间插值方法 专题五 R语言机器学习与空间模型预测及不确定性评估 专题六 R语言空…

htsjdk库ReferenceSequenceFile接口介绍

ReferenceSequenceFile 是 HTSJDK 库中的一个接口,用于表示参考基因组文件。它定义了读取参考基因组序列的标准方法。这个接口使得不同类型的参考基因组文件(如 FASTA 格式)能够以统一的方式进行访问。 ReferenceSequenceFile 接口主要功能 访问参考序列: 提供获取参考基因…

如何在 Windows/Mac/iPhone/Android 上将 PDF 转换为 Word

PDF&#xff08;便携式文档格式&#xff09;是一种流行的格式&#xff0c;广泛用于在数字电子设备中呈现文档。输出文件小且兼容性强&#xff0c;使 PDF 如此受欢迎。但是&#xff0c;编辑 PDF 文件并非免费。您无需购买 PDF 编辑器&#xff0c;而是可以将 PDF 转换为 Word 进行…

嘉兴网站建设的思路

随着互联网的快速发展&#xff0c;网站已经成为企业宣传和推广的重要工具。作为浙江省的一个重要城市&#xff0c;嘉兴具有得天独厚的地理位置和经济实力&#xff0c;因此开展嘉兴网站建设具有重要意义。在进行网站建设的过程中&#xff0c;需要有一定的思路和规划&#xff0c;…

跑深度学习模型Ⅱ:一文安装正确pytorch及dgl

如果要用到GPU &#xff0c;先看这篇安装并保证cuda可用。跑深度学习模型I&#xff1a;一文正确使用CUDA-CSDN博客 啊每次都是pytorch版本问题引发的一系列错误&#xff01; 1. 查看自己的cuda版本 nvcc --version 可以看到我的cuda版本是11.8 nvidia-smi 查看NVIDIA驱动版…

智能变“智障”?云鲸扫地机器人频发故障引质疑

近年来&#xff0c;扫地机器人市场以其智能化技术革新和不断升级的产品功能&#xff0c;成功吸引了消费者的目光&#xff0c;甚至打破了家电行业的价格僵局&#xff0c;实现了价格与价值的双重攀升。然而&#xff0c;在这股智能家电的浪潮中&#xff0c;云鲸扫地机器人却因其频…

【C++从小白到大牛】栈和队列(优先级队列)

目录 引言&#xff1a; 使用方法篇&#xff1a; stack&#xff1a; queue priority_queue 使用方法&#xff1a; 模拟实现篇&#xff1a; stack&#xff1a; 原码&#xff1a; queue 原码&#xff1a; priority_queue 插入和删除数据的思想&#xff1a; 仿函数实…

TDEngine(taos) 涛思数据库-sql初识

一、基本使用 这里读者自行安装数据库&#xff1a;使用安装包立即开始 | TDengine 文档 | 涛思数据 (taosdata.com) // 下载gz文件&#xff0c;解压 tar -zxvf TDengine-server-<对应版本>-Linux-x64.tar.gz// 解压后启动 sudo ./install.sh 启动成功后&#xff0c;直…

动态规划之子数组系列问题

题型介绍 子数组系列动态规划问题长什么样 例题 力扣 53. 最大子数组和 解题步骤&#xff1a; 创建 dp 表以及确定 dp 表中所要填写位置的含义&#xff1a; 首先&#xff0c;根据写题经验&#xff0c;先确定出这道题应该使用的解题思路是 “以某一个位置为结尾进行分析”…

【编码心得】单元测试的那些事

【编码心得】单元测试的那些事 文章目录 单元测试定义&#xff1f;为什么需要单元测试&#xff1f;为重构保驾护航提高代码质量减少 bug快速定位 bug持续集成依赖单元测试团队编码规范要求大牛都写单元测试保住面子 TDD 测试驱动开发何谓 TDD&#xff1f;TDD的基本流程TDD 优缺…

全球轻型汽车市场规划预测:2030年市场规模将接近2502亿元,未来六年CAGR为2.8%

一、引言 随着全球经济的发展和消费者出行需求的增加&#xff0c;轻型汽车作为汽车市场中的重要组成部分&#xff0c;其市场重要性日益凸显。本文旨在探索轻型汽车行业的发展趋势、潜在商机及其未来展望。 二、市场趋势 全球轻型汽车市场的增长主要受全球经济发展、消费者对出…

海风小店微信商城小程序附后端一款免费开源的小程序源码

该商城小程序服务端api基于node.jsThinkJSMySQL&#xff0c;如果对这个不大熟悉的人&#xff0c; 可能有那么一点难度&#xff0c;但是如果只是搭建的话&#xff0c;作者的教程还是比较详细的&#xff0c;而且搭建步骤比较简单&#xff0c; 应该很容易上手&#xff0c;如果你…

【KAN】【API教程】索引

简单来说就是确定激活函数的坐标 from kan import *model = KAN(width=[2,3,2,1]) x = torch.normal(0,1,size=(100,2)) model(x); beta = 100 model.plot(beta=beta) # [2,3,2,1] means 2 input nodes # 3 neurons in the first hidden layer, # 2 neurons in the second hid…

知识图谱开启了一个可以理解的人工智能未来

概述 本文是对利用知识图谱&#xff08;KG&#xff09;的综合人工智能&#xff08;CAI&#xff09;的全面调查研究&#xff0c;其中 CAI 被定义为可解释人工智能&#xff08;XAI&#xff09;和可解释机器学习&#xff08;IML&#xff09;的超集。 首先&#xff0c;本文澄清了…

【Linux学习】实现一个简单版的Shell

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f4d5;前言&#x1f351;shell&#x1f4da;Shell的工作原理&#x1f512;Shell的高级功能 &#x1f680;shell的代码实现&am…

Mybatis实战:#{} 和 ${}的使用区别和数据库连接池

一.#{} 和 ${} #{} 和 ${} 在MyBatis框架中都是用于SQL语句中参数替换的标记&#xff0c;但它们在使用方式和处理参数值上存在一些显著的区别。 #{}的作用&#xff1a; #{} 是MyBatis中用于预编译SQL语句的参数占位符。它会将参数值放入一个预编译的PreparedStatement中&am…

JavaScript ES6语法详解(下)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;我是码喽的自我修养&#xff01;今天给大家分享JavaScript ES6语法详解(下)&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到带大家&#xff0c;欢迎收藏关注…

信创企业级即时通讯发展趋势,私有化安全沟通

信创&#xff08;创新型科技公司&#xff09;在当今的商业环境中发挥着重要作用&#xff0c;因此&#xff0c;他们对于私有化安全沟通的需求日益增加。企业级即时通讯软件是为满足企业内部沟通和协作需求而设计的重要工具。在信创企业中&#xff0c;采用私有化安全沟通解决方案…

乐乐音乐Kotlin版

简介 乐乐音乐Kotlin版&#xff0c;主要是基于ExoPlayer框架开发的Android音乐播放器&#xff0c;它支持lrc歌词和动感歌词(ksc歌词、krc歌词、trc歌词、zrce歌词和hrc歌词等)、多种格式歌词转换器及制作动感歌词、翻译歌词和音译歌词。 编译环境 Android Studio Jellyfish | …