【C++笔记】模板进阶

news2024/9/24 15:20:02

【C++笔记】模板进阶

  • 一、非类型模板参数
  • 二、类模板的特化
  • 三、模板的分离编译

一、非类型模板参数

我们之前学过的模板虽然能很好地帮我们实现泛型编程,比如我们可以让一个栈存储int类型的数据,一个栈存储double类型的数据:

template <class T>
class Stack {
public :
	Stack() {
		cout << "Stack()" << endl;
	}
	~Stack() {
		cout << "~Stack()" << endl;
	}
private :
	T* _data;
}

int main() {
	Stack<int> st1;
	Stack<double> st2;
	return 0;
}

但是如果我们想实现两个静态的栈,一个容量为10,另个一容量为100,那就没有办法了。

对此,C++又引入了一个非类型模板参数

template <class T, size_t N>
class Stack {
public:
	Stack() {
		cout << "Stack()" << endl;
	}
	~Stack() {
		cout << "~Stack()" << endl;
	}
private:
	T data[N];
}

这样我们就可以在实例化的时候给上对应的容量了:

int main() {
	Stack<int, 10> st1;
	Stack<double, 100> st2;
	return 0;
}

需要注意的是
非类型模板参数一定要是常量,不能是变量:
在这里插入图片描述
非类型模板参数一定要是整型(包括整型家族的所有成员char、short……):
在这里插入图片描述
直到C++20版本才引入。

二、类模板的特化

模板的特化就是针对某些类型进行特殊化处理。
比如我们现在随便写一个类模板:
在这里插入图片描述
如果我们想针对两个参数一个是int一个是double的这种情况特殊处理,让它输出不同的内容就可以使用特化:
在这里插入图片描述
上面的这种叫做全特化,与之对应的还有偏特化:
在这里插入图片描述
在匹配的时候也是遵循最匹配原则,看哪个最符合条件就匹配哪个。

而且在特化的时候也并不需要写的很具体,其实也可以像下面这样写:
在这里插入图片描述

特化必须要有原模板,也就是最初的没有任何特化的模板。

三、模板的分离编译

模板其实是不支持分离编译的,即声明和定义分离(声明在一个文件,定义在另个文件)。
在这里插入图片描述
在这里插入图片描述
这样做的话会发生连接错误:
在这里插入图片描述

而我们若是讲一个普通函数分离编译就没问题:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这其中的原因是因为函数模板比普通函数多了一个步骤:实例化,因为函数模板其实和具体函数其实是一个一对多的关系,一个函数模板可以实例化出很多个功能相近但参数和返回值类型不同的函数。
也就是说我们在Stack.cpp中所写的可以比作一个骨架,从中只能得到这个函数的实现逻辑,所以在编译Stack.cpp的时候并不能生成具体的函数地址,这样main函数在调用的时候就自然找不到了。

解决这个问题的其中一种方法就是显示实例化:
在这里插入图片描述
在这里插入图片描述

但这种方法并不是一种很好的方法,因为它每一次只能解决一种类型,而且每一种类型都得要显示声明一次,这会是代码用于。

还有一种方法就是直接将声明和定义放在同一个文件里:
在这里插入图片描述

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

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

相关文章

Git 为文件添加执行权限

背景 当你是一台Linux&#xff0c;想要给文件加权限很简单&#xff0c;只需要执行以下命令 chmod x filename就可以给文件添加执行权限&#xff0c;但是如果你是Windows那就很麻烦了 解决方案 假设这里有一个名为 file.sh 的文件&#xff0c;内容如下&#xff1a; #!/bin/…

视频剪辑SDK,实现高效的移动端视频编辑

为了满足企业对视频编辑的需求&#xff0c;美摄提供了iOS/Android端视频编辑SDK技术开发服务&#xff0c;帮助企业快速高效地制作高质量视频。本文将详细介绍美摄的视频编辑SDK的优势和特点&#xff0c;以及如何为企业提供技术解决方案。 随着智能手机的普及和移动互联网的发展…

Java_Jdbc

目录 一.JDBC概述 二.JDBC API 三.ResultSet[结果集] 四.Statement 五.PreparedStatement 六. JDBC API 总结 一.JDBC概述 JDBC 为访问不同的数据库提供了同一的接口&#xff0c;为使用着屏蔽了细节问题Java程序员使用JDBC 可以连接任何提供了 JDBC驱动的数据库系统&am…

(缺省参数)(函数重载)(引用)(内敛)(C++中的nullptr)

&#xff08;缺省参数&#xff09;&&#xff08;函数重载&#xff09;&&#xff08;引用&#xff09;&&#xff08;内敛&#xff09;&&#xff08;atuo用法&#xff09;&&#xff08;C中的NULL&#xff09; 1.缺省参数1.1缺省参数的概念1.2缺省参数的分类1…

谈谈电商App的压测

背景 最近恰逢双十一&#xff0c;大大小小的电商app在双十一之前都会做一次压测&#xff0c;曾经在小公司工作的时候很想知道大公司是如何压测的&#xff0c;有什么高深的压测工具没&#xff0c;本文就来揭露一下 压测真相 在确认使用什么压测工具进行压测之前&#xff0c;我…

(※)力扣刷题-栈和队列-用栈实现队列

使用栈实现队列的下列操作&#xff1a; push(x) – 将一个元素放入队列的尾部。pop() – 从队列首部移除元素。peek() – 返回队列首部的元素。empty() – 返回队列是否为空。 说明: 你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size, 和 is empt…

R6G alkyne, 6-isomer可在反应中作为底物或催化剂发挥作用

试剂 | 基础知识概述&#xff08;部分&#xff09;: 英文名&#xff1a;R6G alkyne, 6-isomer 分子式&#xff1a;C30H29N3O4 分子量&#xff1a;495.57 Ex &#xff1a;518nm Em&#xff1a;542nm 规格标准&#xff1a;10mg、25mg、50mg&#xff0c;可提供mg级以及kg级的…

系统架构师备考倒计时16天(每日知识点)

1.信息化战略与实施 2.UML图&#xff08;12个&#xff09; 3.结构化设计&#xff08;耦合&#xff09; 4.SMP与AMP的区别&#xff08;多核处理器的工作方式&#xff09; 多核处理器一般有SMP和AMP两种不同的工作方式: SMP(对称多处理技术)&#xff1a;将2颗完全一样的处理器封…

24---WPF缓存

一、什么是缓存&#xff1a; 1.缓存指的是将需要频繁访问的网络内容存放在离用户较近、访问速度更快的系统中&#xff0c;以提高内容访问速度的一种技术。缓存服务器就是存放频繁访问内容的服务器。 2.缓存就是一个临时存放区域--离用户比较近 二、作用--意义---如果系统出现故…

郭明錤修正预测:苹果第二代AirTag推迟2025年量产

10月19日&#xff0c;知名分析师郭明錤调整今年8月关于苹果第2代AirTag的预测&#xff0c;表示该产品量产时间从先前预测的2024年Q4延迟至2025年&#xff0c;并进一步推迟新款上市日期。 AirTag是苹果公司推出的一款蓝牙设备&#xff0c;配合苹果设备的“查找”APP&#xff0c…

【综述】Diffusion Models: A Comprehensive Survey of Methods and Applications

Diffusion Models: A Comprehensive Survey of Methods and Applications 论文&#xff1a;https://arxiv.org/abs/2209.00796 github&#xff1a;https://github.com/YangLing0818/Diffusion-Models-Papers-Survey-Taxonomy 目录 Diffusion Models: A Comprehensive Survey…

双指针——复写零

一&#xff0c;题目要求 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改&#xff0c;不要从函数返回任何东…

【Java基础面试三十一】、String a = “abc“; ,说一下这个过程会创建什么,放在哪里?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;String a “abc”; &am…

web:[极客大挑战 2019]HardSQL

题目 打开页面显示为 查看源代码没有发现其他的提示信息&#xff0c;随便尝试一下 错误 题目名为hardsql&#xff0c;先来尝试有无sql注入存在 尝试输入单引号输入 显示页面存在注入 这里按照常规思路继续使用order by函数和union select函数进行查询&#xff0c;但是页面没有…

019-第三代软件开发-Git提交规范

第三代软件开发-Git提交规范 文章目录 第三代软件开发-Git提交规范项目介绍Git提交规范分支规范Commit Message FormatHeaderBodyFooterRevert 总结一下 关键字&#xff1a; Qt、 Qml、 git、 Commit、 release 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个…

【三维重建】DreamGaussian:高斯splatting的单视图3D内容生成(原理+代码)

文章目录 摘要一、前言二、相关工作2.1 3D表示2.2 Text-to-3D2.3 Image-to-3D 三、本文方法3.1生成式 高斯 splitting3.2 高效的 mesh 提取3.3 UV空间的纹理优化 四. 实验4.1实施细节4.2 定性比较4.3 定量比较4.4 消融实验 总结&#xff08;特点、局限性&#xff09; 五、安装与…

【MySQL系列】- Select查询SQL执行过程详解

【MySQL系列】- Select查询SQL执行过程详解 文章目录 【MySQL系列】- Select查询SQL执行过程详解一、SQL查询语句的执行过程二、SQL执行过程详解2.1. 连接器2.2. 查询缓存2.3. 分析器2.4. 优化器2.5. 执行器 三、undo log 和 redo log作⽤3.1. redo log &#xff08;重做日志&a…

面试算法31:最近最少使用缓存

题目 请设计实现一个最近最少使用&#xff08;Least Recently Used&#xff0c;LRU&#xff09;缓存&#xff0c;要求如下两个操作的时间复杂度都是O&#xff08;1&#xff09;。 get&#xff08;key&#xff09;&#xff1a;如果缓存中存在键key&#xff0c;则返回它对应的值…

lunux查找占用内存前10的进程

1、使用Top命令查询进程 输入 top 命令&#xff0c;然后按下大写M按照内存MEM排序&#xff0c;按下大写P按照CPU排序。 2、查询占用CPU最高的前10个进程 ps aux|head -1;ps aux|grep -v PID|sort -rn -k 3|head 3、查询占用内存最大的前10个进程 ps aux|head -1;ps aux|grep …

Visual Studio Code官网下载、vscode下载很慢、vscode下载不了 解决方案

前言 开发界的小伙伴们对于Visual Studio Code开发环境来可以说非常熟悉了&#xff0c;但由于在Visual Studio Code官网的下载速度非常的慢&#xff0c;即便开了代理也是一样的很慢、甚至下载被中断&#xff0c;几乎不能下载。 解决方案 1、在Web浏览器上打开vscode官网&#…