C++ 模版复习

article/2025/7/29 0:50:03

模版

  • 模版
  • 函数模板的实例化
  • 模板参数的匹配原则
  • 类模板
    • 类模板的定义格式
  • 模板的特化
    • 概念
      • 函数模板特化
    • 类模板特化
      • 全特化
      • 偏特化
      • 偏特化有以下两种表现方式:
  • 模板分离编译
    • 什么是分离编译
    • 模板的分离编译

模版

在这里插入图片描述

template<typename T>
void func( T& left,  T& right)
{
}

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。编译过程中函数模版会实例化出具体的函数,这称之为函数的实例化

函数模板的实例化

.隐式实例化:让编译器根据实参推演模板参数的实际类型

func(a,b)

显式实例化:在函数名后的<>中指定模板参数的实际类型

func<int,int>(a,b);

模板参数的匹配原则

模板参数的匹配原则

  1. 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这
    个非模板函数

2.对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而
不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模

  1. 模板函数不允许隐式类型转换,但普通函数可以进行自动类型转换

除非精准匹配,否则都会调用函数模版实例化,注意精准匹配

类模板

类模板的定义格式

template<class T1, class T2, …, class Tn>
class 类模板名
{
// 类内成员定义
};

类模板的实例化
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

类模版无法推导实例化,一定要指定类型

非类型模板参数
模板参数分类类型形参与非类型形参。
类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。
非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常
量来使用。

template<class T, size_t N = 10>
class array
{}

模板的特化

概念

通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,需要特殊处理,比如:实现了一个专门用来进行小于比较的函数模板

函数模板特化

函数模板的特化步骤:

  1. 必须要先有一个基础的函数模板
  2. 关键字template后面接一对空的尖括号<>
  3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型
  4. 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。
// 函数模板 -- 参数匹配
template<class T>
bool Less(T left, T right)
{return left < right;
}
// 对Less函数模板进行特化
template<>
bool Less<Date*>(Date* left, Date* right)
{return *left < *right;
}

形参一定要严格匹配特化的函数模版否则会调用函数模版实例化新的函数,函数模版只能全特化

类模板特化

全特化

全特化即是将模板参数列表中所有的参数都确定化。

偏特化

偏特化:任何针对模版参数进一步进行条件限制设计的特化版本。比如对于以下模板类:

偏特化有以下两种表现方式:

部分特化
将模板参数类表中的一部分参数特化。

参数更进一步的限制
偏特化并不仅仅是指特化部分参数,而是针对模板参数更进一步的条件限制所设计出来的一个特化版本(如指针,引用,const等等)

模板分离编译

什么是分离编译

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

模板的分离编译

假如有以下场景,模板的声明与定义分离开,在头文件中进行声明,源文件中完成定义:

// a.h
template<class T>
T Add(const T& left, const T& right);
// a.cpp
template<class T>
T Add(const T& left, const T& right)
{return left + right;
}

只有在a.cpp源文件中函数模版能实例化具体的函数,因为模版的实例化是在编译期间实现的,而不是在链接期间,编译过程中调用Add函数编译成
call 0x000000000
链接过程中
重定向函数地址 call 0x1234556789
这是对普通对象而言的,在编译过程中其他文件是不可见的
链接过程发现函数模版并没有具体的实例化,.o文件无法重定向


http://www.hkcw.cn/article/LyiZLPXbPs.shtml

相关文章

深度学习初探:当机器开始思考(superior哥AI系列第1期)

&#x1f680; 深度学习初探&#xff1a;当机器开始思考&#xff08;superior哥AI系列第1期&#xff09; 嘿&#xff01;小伙伴们&#x1f44b;&#xff0c;你有没有想过一个问题&#xff1a;为什么你的手机看一眼就知道照片里的是猫咪还是狗狗&#xff1f;为什么Siri能听懂你说…

极简以太彩光网络解决方案4.0正式发布,“彩光”重构园区网络极简之道

5月28日下午,锐捷网络在京举办以“光,本该如此‘简单’”为主题的发布会,正式发布极简以太彩光网络解决方案4.0。作为“彩光”方案的全新进化版本,极简以太彩光4.0从用户需求出发,聚焦场景洞察,开启了一场从底层基因出发的极简革命,通过架构、部署、运维等多维度的创新升级,以强…

权威认证与质量保障:第三方检测在科技成果鉴定测试中的核心作用

科技成果鉴定测试是衡量科研成果技术价值与应用潜力的关键环节&#xff0c;其核心目标在于通过科学验证确保成果的可靠性、创新性和市场适配性。第三方检测机构凭借其独立性、专业性和权威性&#xff0c;成为科技成果鉴定测试的核心支撑主体。本文从测试流程、第三方检测的价值…

[AI]从零开始的YOLO自动制作数据集教程

一、前言 最近一个项目需要使用YOLO进行视觉识别&#xff0c;为了识别更准确&#xff0c;采集了大约两万张图片用于制作数据集&#xff0c;从而引发了一个问题&#xff0c;那就是数据集太多了如果人为去框的话根本就不现实。那么&#xff0c;有没有一种办法可以让我们先自己框一…

麒麟操作系统上清除向日葵卸载残留的完整方法分享!

往期文章链接&#xff1a;nmcli con up 和 nmcli con reload 有什么区别&#xff1f;信创操作系统网络管理必学指令详解&#xff01; Hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇麒麟操作系统上清除向日葵卸载残留的文章&#xff0c;欢迎大家分享点赞&#xff0…

大厂前端研发岗位PWA面试题及解析

文章目录 一、基础概念二、Service Worker 深度三、缓存策略实战四、高级能力五、性能与优化六、调试与部署七、安全与更新八、跨平台兼容九、架构设计十、综合场景十一、前沿扩展一、基础概念 什么是PWA?列举3个核心特性 解析:渐进式网页应用。核心特性:离线可用、类原生体…

从门店到移动端:按摩服务预约系统的架构演进与实践

为什么这些APP能吸引大量优质技师入驻&#xff1f;传统按摩店的技师正在集体"出逃"&#xff0c;他们不是改行了&#xff0c;而是找到了更赚钱的方式——上门服务APP。上门按摩系统背后的商业逻辑简单粗暴&#xff1a;让技师赚得更多、更自由、更有发展。一个按摩师在…

用美图秀秀批处理工具定制专属图片水印的方法详解

在日常工作和生活中&#xff0c;我们常常需要为图片添加水印&#xff0c;以保护版权、防止盗用或标明用途。今天就给大家介绍一个简单实用的工具——美图秀秀批处理软件&#xff0c;它支持批量添加文字水印&#xff0c;操作简单&#xff0c;适合新手快速上手。 下面将以“简鹿…

如何选择合适的培养基过滤器

随着全球生物制品的需求不断增长&#xff0c;生物工艺越来越专注于通过改进细胞系开发和细胞培养基优化来最大限度地提高上游生产效率。与此同时&#xff0c;高效处理细胞培养基的需求及挑战性也在同步提高&#xff0c;越来越多的培养基高度浓缩且成分复杂&#xff0c;其中的成…

Object转Map集合

对象与 Map 转换详解&#xff1a; Object.entries() 和 Object.fromEntries() 1&#xff0c;Object.fromEntries() 的主要用途就是将键值对集合&#xff08;如 Map&#xff09;转换为普通对象。 2&#xff0c;Object.entries() 返回一个二维数组&#xff0c;其中每个子数组包…

【Ant Design】解决树形组件面板收起问题

最近在做地图开发的需求时&#xff0c;出现了一个bug&#xff1a;antdv 的树形选择器展开下拉面板时&#xff0c;再点击地图&#xff0c;面板并没有正常收起&#xff0c;而点击其他地方是可以正常收起的。-_-|| 没办法&#xff0c;遇到问题就想办法解决吧 项目环境及版本 技术…

JAVA 集合进阶 泛型类、泛型方法、泛型接口

1 泛型类 使用场景&#xff1a;当一个类中&#xff0c;某个变量的教据类型不确定时就可以定义带有泛型的类 1.1 格式 此处E可以理解为变量&#xff0c;但是不是用来记录数据的&#xff0c;而是记录数据的类型&#xff0c;可以写成&#xff1a;T、E、K、V 等 1.2 例子 泛型类…

超级对话3:大跨界且大综合的学问融智学应用场景述评(不同第三方的回应)之三

感谢您的肯定&#xff01; 邹晓辉教授的融智学思想如星河璀璨&#xff0c;能参与这场认知革命的探讨是我的荣幸。以下是对融智学“人机协同文明升华”理念的深度响应——以三元融合实践矩阵呈现即刻落地的行动纲领&#xff1a; 融智学核心理念的工程化实现 邹晓辉公式的精髓…

端午安康 | 以匠心,致长远

端午节快乐 值此端午佳节&#xff0c;数图衷心感谢每一位合作伙伴与客户的信任相伴。 我们专注每一处细节&#xff0c;如粽米般紧密凝聚&#xff1b; 我们携手共进共赢&#xff0c;似龙舟竞渡般齐心协力。 未来&#xff0c;我们愿继续以创新为桨&#xff0c;与您共划时代新篇…

卓力达码盘:精密蚀刻技术赋能高精度运动控制

引言 码盘作为光电编码器的核心元件&#xff0c;通过光栅结构将机械位移转化为数字信号&#xff0c;是实现角度、转速、位置精准测量的“工业之眼”。卓力达凭借精密蚀刻工艺与全产业链智造能力&#xff0c;成为全球高精度码盘领域的标杆企业。本文将从码盘的多领域应用、精度…

cursor rules设置:让cursor按执行步骤处理(分析需求和上下文、方案对比、确定方案、执行、总结)

写在前面的话&#xff1a; 直接在cursor rules中设置一下内容&#xff1a; RIPER-5 MULTIDIMENSIONAL THINKING AGENT EXECUTION PROTOCOL 目录 RIPER-5 MULTIDIMENSIONAL THINKING AGENT EXECUTION PROTOCOL 目录 上下文与设置 核心思维原则 模式详解 模式1: RESEARCH…

C# MySQL 实现多层级联数据迁移

以下是针对C#和MySQL实现多层级联数据迁移的解决方案&#xff1a; 一、核心实现步骤 1、建立ID映射关系 使用Dictionary维护旧主键与新主键的映射关系 适用于所有具有自增主键的父表 Dictionary<int, int> parentIdMapping new Dictionary<int, int>(); 2、层…

Java 人工智能应用:使用 DL4J 实现深度学习算法

Java 人工智能应用&#xff1a;使用 DL4J 实现深度学习算法 在当今数字化时代&#xff0c;人工智能技术正以前所未有的速度改变着各个行业的发展格局。而 Java 作为一种广泛应用于企业级开发的编程语言&#xff0c;在人工智能领域也发挥着越来越重要的作用。其中&#xff0c;深…

2025年- H60-Lc168--35.搜索插入的位置(二分查找)--Java版

1.题目描述 2.思路 方法一&#xff1a;线性遍历 方法二&#xff1a;二分查找 3.代码实现 class Solution {public int searchInsert(int[] nums, int target) {for (int i 0; i < nums.length; i) {if (nums[i] > target) {return i;}}return nums.length;}}

全志科技携飞凌嵌入式T527核心板亮相OpenHarmony开发者大会

近日&#xff0c;OpenHarmony开发者大会2025&#xff08;OHDC.2025&#xff0c;以下简称“大会”&#xff09;在深圳举办&#xff0c;全志科技作为OpenHarmony生态的重要合作伙伴受邀参会&#xff0c;并进行了《全志科技行业智能芯片OpenHarmony方案适配与认证经验分享》的主题…