【C++初阶】模板进阶

news2025/1/15 16:51:14

文章目录

  • 非类型模板参数
  • 模板特化
    • 函数模板特化
    • 类模板特化
      • 全特化
      • 偏特化
  • 模板的分离编译
  • 模板总结
  • 所有测试的代码

非类型模板参数

模板参数分类类型形参与非类型形参
1.类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。
2.非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。
在这里插入图片描述
在这里插入图片描述
注意:
1.浮点数、类对象以及字符串是不允许作为非类型模板参数的。
2.非类型的模板参数必须在编译期就能确认结果。

模板特化

函数模板特化

通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,需要特殊处理。
在这里插入图片描述
在这里插入图片描述
函数模板的特化步骤:

  1. 必须要先有一个基础的函数模板
  2. 关键字template后面接一对空的尖括号<>
  3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型
  4. 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。

注意:一般情况下如果函数模板遇到不能处理或者处理有误的类型,为了实现简单通常都是将该函数直接给
出。

类模板特化

全特化

全特化即是将模板参数列表中所有的参数都确定化。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

偏特化

偏特化有以下两种表现方式
1.部分特化
将模板参数类表中的一部分参数特化。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.参数更进一步的限制
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

模板的分离编译

概念
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。
模板的声明与定义分离开,在头文件中进行声明,源文件中完成定义(这样是不行的,在链接的时候编译器会报错)
解决方法

  1. 将声明和定义放到一个文件 “xxx.hpp” 里面或者xxx.h其实也是可以的。推荐使用这种。
  2. 模板定义的位置显式实例化。这种方法不实用,不推荐使用。

模板总结

在这里插入图片描述

所有测试的代码

//template<class T>
//void Swap(const T& a, const T& b)
//{
//	cout << "Swap(const T& a, const T& b)" << endl;
//}
//template<>
//void Swap<int>(const int& a, const int& b)
//{
//	cout << "Swap<int>(const int& a, const int& b)" << endl;
//}
//void test_function_Special()
//{
//	//函数模板特化
//	double x1 = 0;
//	int x2 = 0;
//	double y1 = 0;
//	int y2 = 0;
//	Swap(x1, y1);
//	Swap(x2, y2);
//}
//template<class T1,class T2>
//class Date
//{
//public:
//	Date()
//	{
//		cout << "Date<T1,T2>" << endl;
//	}
//private:
//	T1 d1;
//	T2 d2;
//};

//template<>
//class Date<int, double>
//{
//public:
//	Date()
//	{
//		cout << "Date<int,double>" << endl;
//	}
//private:
//	int d1;
//	double d2;
//};

//template<class T1, class T2>
//class Date
//{
//public:
//	Date()
//	{
//		cout << "Date<T1,T2>" << endl;
//	}
//private:
//	T1 d1;
//	T2 d2;
//};
//template<class T2>
//class Date<int,T2>
//{
//public:
//	Date()
//	{
//		cout << "Date<int,T2>" << endl;
//	}
//private:
//	int d1;
//	T2 d2;
//};

//template<class T1, class T2>
//class Date
//{
//public:
//	Date()
//	{
//		cout << "Date<T1,T2>" << endl;
//	}
//private:
//	T1 d1;
//	T2 d2;
//};
//template<class T1, class T2>
//class Date<T1*, T2*>
//{
//public:
//	Date()
//	{
//		cout << "Date<T1*,T2*>" << endl;
//	}
//private:
//	T1 d1;
//	T2 d2;
//};
//void test_calss_Special()
//{
//	全特化
//	//Date<double, char> T1;
//	//Date<int, char> T2;
//	//Date<int, double>  T3;
//	//偏特化
//	Date<double, char> T4;
//	Date<int, char> T5;
//	Date<int, double> T6;
//	Date<int*, double*> T7;
//}
//int main()
//{
//	//test_function_Special();
//	test_calss_Special();
//	return 0;
//}

非模板类型参数
//template<class T,int N = 10>
//class arry
//{
//private:
//	//创建一个静态数组
//	T a[N];
//};
//int main()
//{
//	arry<int, 100> arr;
//	return 0;
//}

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

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

相关文章

创建城市人口总量趋势图

创建城市人口总量趋势图学习目标使用数据人口总量趋势方程数据导入对数据进行处理fct_reorder2的应用对数据进行整理对图像进行可视化操作使用fct_reorder2去掉趋势点内容小结学习目标 我们所采用的学习内容来自B站的Lizongzhang老师的R语言的学习分享 今天学习的主要内容是关…

数据集说明:COCO的两个数据集COCO-stuff和COCO-Caption

数据集图片数量比较 COCO-Caption有33万张图、50万个caption COCO-Stuff有16.4万张图 172个类别(80thing、91stuff、1个未标注类) COCO-stuff的具体类别说明 COCO-Stuff contains 172 classes:80 thing, 91 stuff, and 1 class unlabeled. The 80 thing classes are the same …

群晖nas部署python项目

事件起因是因为想再硬盘里下载小姐姐&#xff0c;在线播放会卡顿很不爽&#xff0c; 开始用一些在线爬的网站&#xff0c;网速非常慢&#xff0c;我发现自己有nas 如果把项目部署再nas上 通过命令行下载就好了 我就开始检索资料&#xff0c;发现网上的都是一些过时的文章&#…

分布式系统关键路径延迟分析实践

作者 | 月色如海 导读 随着对用户体验的不断追求&#xff0c;延迟分析成为大型分布式系统中不可或缺的一环。本文介绍了目前在线服务中常用的延迟分析方法&#xff0c;重点讲解了关键路径分析的原理和技术实现方案&#xff0c;实践表明此方案效果显著&#xff0c;在耗时优化方面…

图解深度学习-提高泛化能力的方法

数据集 在深度学习的训练过程中&#xff0c;神经网络的类型和结构固然重要&#xff0c;但训练样本才是重中之重。 数据增强 当训练样本数量较少时&#xff0c;可以通过数据增强来增加样本的多样性。 数据增强就是通过对样本图像进行平移、旋转、镜像翻转等方式进行变换。除…

【Java】Log4j日志

目录 1.日志概述 日志是什么 为什么会有日志 2.log4j概述 什么是log4j 版本 3.log4j入门案例 步骤 实现 总结 4.log4j1详情&#xff1a;记录器rootLogger 5.log4j1详情&#xff1a;日志级别 6.log4j1详情&#xff1a;输出源appender ConsoleAppender FileAppend…

第二十八章 数论——扩展欧几里德算法与线性同余方程

第二十八章 扩展欧几里德算法一、裴蜀定理1、定理内容2、定理证明二、扩展欧几里德定理1、作用2、思路3、代码三、线性同余方程1、问题2、思路3、代码一、裴蜀定理 1、定理内容 对于任意整数aaa和bbb&#xff0c;一定存在整数xxx&#xff0c;yyy使得axbyaxbyaxby是gcd(a,b)gc…

Linux的基本指令

前言 相对于linux操作系统,其实window也是操作系统&#xff0c;我们这节课说的是Linux的基本指令 那么在window上有没有基本指令呢&#xff0c;答案是有的&#xff0c;我们可以使用windowsr进入cmd就可以用我们的基本指令 基本指令 在本文中&#xff0c;我们基本上都使用类比的…

基于threeJS实现圣诞节孔明灯效果

1.效果图 2.实现思路 使用three.js的套路几乎是固定的&#xff1a; 1 初始化场景&#xff08;scene&#xff09; 2.创建透视相机&#xff08;camera&#xff09; 3.设置相机位置&#xff08;position&#xff09; 4.创建纹理加载器对象&#xff08;texture&#xff09; 5.创建…

【SegNeXt】语义分割中对卷积注意力设计的反思

目录 1.摘要 2.相关工作 2.1语义分割 2.2多尺度网络 2.3注意力机制 3.网络结构 3.1卷积编码器 3.2解码器 4.实验 个人总结&#xff1a; 论文链接&#xff1a;论文 代码链接&#xff1a;代码 论文发表于NeurIPS 2022&#xff0c;值得注意的是&#xff0c;在Transforme…

UVM入门和进阶实验0

一. 概述 UVM学习流程仍然按照SV时候的核心流程&#xff0c;即&#xff1a; 如何搭建验证框架验证组件之间的连接和通信如何编写测试用例&#xff0c;继而完成复用和覆盖率的收敛 我们UVM入门和进阶实验0还是同之前SV验证实验0思想一样&#xff0c;让大家通过简单的实验要求…

学习HTTP协议,这一篇就够啦 ~~

HTTP协议一、什么是HTTP1.1 应用层协议1.2 HTTP1.3 HTTP协议的工作过程二、HTTP协议格式2.1 Fiddler抓包工具2.2 协议格式三、HTTP请求 (Request)3.1 认识 "方法" (method)3.1.1 GET 方法3.1.2 POST 方法3.1.3 GET和POST比较3.1.4 其他方法3.2 认识URL3.2.1 URL基本格…

基于迅为3568开发板的多屏同/异显动态方案

iTOP-RK3568开发板采用四核Cortex-A55处理器&#xff0c;芯片内置VOP控制器&#xff0c;支持HDMI、LVDS、MIPI、EDP四种显示接口的多屏同显、异显和异触&#xff0c;可有效提高行业定制的拓展性。 iTOP-RK3568开发板支持以下屏幕&#xff1a; 迅为 LVDS 7 寸屏幕 迅为 LVDS …

【数学】三角函数小题

∣三角函数小题NightguardSeries.∣\begin{vmatrix}\huge{\textsf{ 三角函数小题 }}\\\texttt{Nightguard Series.}\end{vmatrix}​ 三角函数小题 Nightguard Series.​​ 以下是一些废话 不愿意看的可以跳过 最近守夜人更新得很慢&#xff0c;守夜人拖更主要有三个原因&#…

Hudi(1):Hudi概述

目录 0. 相关文章链接 1. Hudi简介 2. 发展历史 3. Hudi特性 4. 使用场景 4.1. 近实时写入 4.2. 近实时分析 4.3. 增量 pipeline 4.4. 增量导出 0. 相关文章链接 Hudi文章汇总 1. Hudi简介 Apache Hudi&#xff08;Hadoop Upserts Delete and Incremental&#xff0…

servlet(三)文件的下载

主要有几个步骤: 1、获取要下载的文件名 2、读取要下载的文件内容 (通过 ServletContext 对象可以读取,这个也是 ServletContext的应用) 3、获取要下载的文件类型 4、在回传前&#xff0c;通过响应头告诉客户端返回的数据类型 5、还要告诉客户端收到的数据是用于下载使用&#…

Web APIs 简介、DOM

文章目录一、Web APIs 简介1、Web APIs 和 JS 基础关联性2、API 和 Web API二、DOM1、DOM简介2、获取元素&#xff08;1&#xff09;根据ID获取&#xff08;2&#xff09;根据标签名获取&#xff08;3&#xff09;通过HTML5新增的方法获取&#xff08;4&#xff09;获取特殊元素…

【数据库数据恢复】oracle数据库执行truncate table的数据恢复案例

数据库恢复环境&#xff1a; 操作系统&#xff1a;windows server&#xff1b; 数据库&#xff1a;win_oracle_x64。 数据库故障&分析&#xff1a; oracle数据库误truncate table&#xff0c;备份无法使用。 oracle数据库误操作导致数据丢失是比较常见的一种故障&#xf…

《Linux运维总结:Centos7.6二进制安装Mysql8.0.30》

一、安装Mysql服务 1.1、下载二进制安装包 官方&#xff1a;二进制安装包下载 [rootlocalhost ~]# cd /data/pkgs [rootlocalhost pkgs]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz [rootlocalhost pkgs]# tar a…

启动报异常:org.yaml.snakeyaml.parser.ParserException: while parsing a block mapping

目录 异常信息 异常原因 解决结果 异常信息 17:20:38.414 [main] ERROR o.s.b.SpringApplication - [reportFailure,870] - Application run failedorg.yaml.snakeyaml.parser.ParserException: while parsing a block mapping in reader, line 4, column 3: name: R…