c++ - 模板(二)

news2025/3/16 13:36:31

文章目录

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


一、模板参数缺省值

给模板初始值与给函数初始值类似,当需要给一部分缺省值时,参数缺省值必须从右向左给,中间不能留着参数不给缺省值。

template< class T = int>
void test01()
{
	cout << "T: "<<typeid(T).name() << endl;
}

template<class T1, class T2 = int>
void test02()
{
	cout << "T1: "<<typeid(T1).name() << endl;
	cout << "T2: "<<typeid(T2).name() << endl;
}

int main()
{
	//使用默认缺省值
	test01();

	//指定
	test01<double>();

	//部分缺省
	test02<double>();

	//全部指定
	test02<double,double>();

	return 0;
}

在这里插入图片描述

二、非类型模板参数

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

//T为类型,N为常量
template< class T, size_t N>
class Arr
{
public:
	Arr()
	{
		cout << N << endl;
	}

private:
	int arr[N] = {0};
};

int main()
{
	Arr<int, 10> arr;
	return 0;
}

在这里插入图片描述

注意:

  1. 浮点数、类对象以及字符串是不允许作为非类型模板参数的。
  2. 非类型的模板参数必须在编译期就能确认结果。

三、模板的特化

1、函数模板特化
有一些场景只通过通用的函数模板是无法求正确答案的。
如:

template< class T>
void Sub(T a,T2 )
{
	cout << a - b << endl;
}

int main()
{
	int a = 20;
	int b = 10;

	//没有问题
	Sub(a, b);

	//出错了,求的是指针的差
	Sub(&a, &b);

	return 0;
}

在这里插入图片描述

对于上面情况可以通过函数模板特化解决
函数模板的特化步骤:

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


template<>
void Sub<int*>(int* a, int* b)
{
	cout << *a - *b << endl;

}
int main()
{
	int a = 20;
	int b = 10;

	//没有问题
	Sub(a, b);

	//使用特化的模板
	Sub(&a, &b);

	return 0;
}

在这里插入图片描述
另一种解决方法就是直接写一个该类型的函数,这个函数会与模板函数构成重载,并且符合的话会被优先使用

template< class T>
void Sub(T a,T b)
{
	cout <<"void Sub(T a,T b)"<< endl;
}

void Sub(int* a, int* b)
{
	cout <<"void Sub(int* a, int* b)" << endl;
}
int main()
{
	int a = 20;
	int b = 10;
	 
	//使用模板
	Sub(a, b);

	//使用现成函数
	Sub(&a, &b);

	return 0;
}

在这里插入图片描述
2、类模板特化
类特化的方式与函数模板特化参不多,就是原本在函数名指定改为在类名指定。
(1)全特化
全特化就是全部参数被指定。

template<class T1,class T2>
class A
{
public:
	A() { cout<<"class A" << endl; }
};

template<>
class A<int,char>
{
public:
	A() { cout << "class A<int,char>" << endl; }
};

int main()
{
	//调用通用模板
	A<int, int> a1;

	//使用特化模板
	A<int, char> a2;

	return 0;
}

在这里插入图片描述
(2)偏特化
只特化一部分参数:
在这里插入图片描述
限定参数:

template<class T1, class T2>
class A
{
public:
	A() { cout << "class A" << endl; }
};

template<class T1,class T2>
class A<T1*, T2*>
{
public:
	A() { cout << "class A<T1*, T2*>" << endl; 
	cout <<"T1:" << typeid(T1).name() << endl;
	}
};

template<class T1, class T2>
class A<T1&, T2&>
{
public:
	A() { cout << "class A<T1&, T2&>" << endl;
	cout << "T1:" << typeid(T1).name() << endl;
	}
};

int main()
{
	//调用通用模板
	A<int, int> a1;

	//使用特化模板
	//虽然传的是int*,但是T1还是int
	A<int*, int*> a2;

	//虽然传的是double&,但是T1还是double
	A<double&, double&> a3;
	
	return 0;
}

在这里插入图片描述

四、模板的分离编译

1、关于类模板实例化:
例:

template<class T>
class A
{
public:
	//重命名
	typedef T TYPE;
};

template<class T>
void test03()
{
	//会检查语法等
	A<T>::TYPE a = 10;
}

int main()
{
	test03<int>();
	return 0;
}

在这里插入图片描述

在没有被实例化时,编译器只会对函数进行语法等检查,不会查看类内部细节,如上面的A<T>::TYPE a = 10 TYPE是类型按道理来说没有问题,但是编译器在检查到这里是就会出现歧义,不知道TYPE是类型还是静态变量,所以就会报错。

对于上述这种情况,我们可以加一个 typename 关键字来说明TYPE是一个类型,这样就不会报错了。

typename A<T>::TYPE a = 10;

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

3、为什么模板分离编译会报错
在这里插入图片描述

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

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

相关文章

yangwebrtc x86_64环境搭建

版本&#xff1a;5.0.099 sudo apt-get install libxext-dev sudo apt-get install x11proto-xext-dev sudo apt-get install libxi-dev sudo apt install libasound2-dev sudo apt install libgl1-mesa-dev sudo apt-get install libxtst-dev 用qt打开以下两个项目的.pro met…

主机加固的最后一米防护

智慧互联的浪潮正席卷全球&#xff0c;它不仅重塑了传统的工业格局&#xff0c;也催生了无数创新的商业模式。随着物联网和互联网技术的飞速发展&#xff0c;智能化、自动化、联网化已成为未来各个行业的发展方向。然而&#xff0c;智慧物联的开放性、系统的漏洞以及基于用户、…

前端开发入门指南:掌握网页设计的第一课

UI设计与前端开发是相辅相成&#xff0c;UI设计可以视觉美化产品界面&#xff0c;而前端开发可以通过代码实现设计稿。作为UI设计师&#xff0c;如果画出来的图片美观方便对前端开发者非常有益。如果设计复比较难以实现&#xff0c;沟通就会变得更加困难。因此&#xff0c;UI设…

从高海拔到严寒季的测量作业更要「快准稳」,怎么实现?

西藏那曲海拔4500米公路勘测项目赶工期 “必须要保障在西藏那曲地区承接的公路勘测项目赶工期需求&#xff0c;海拔高达4500米、网络通讯不足、部分范围存在无网以及地基信号覆盖可能不足的情况&#xff0c;需要能满足环境和项目需求的专业RTK设备紧急送到。” 客户的一个电话…

保护关键业务资产的四个步骤

提到 “关键资产 ”&#xff0c;相信大家并不陌生&#xff0c;它是企业 IT 基础设施中对组织运作至关重要的技术资产。如果这些资产&#xff08;如应用服务器、数据库或特权身份&#xff09;出现问题&#xff0c;势必会对企业安全态势造成严重影响。 但每项技术资产都被视为关…

【K8s】专题四(5):Kubernetes 控制器之 DaemonSet

以下内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01;如果对您有帮助&#xff0c;烦请点赞、关注、转发&#xff01;欢迎扫码关注个人公众号&#xff01; 目录 一、基本介绍 二、工作原理 三、相关特性 四、资源清单&#xff08;示例&#xff09; 五…

[数据集][目标检测]叶子计数检测数据集VOC+YOLO格式240张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;240 标注数量(xml文件个数)&#xff1a;240 标注数量(txt文件个数)&#xff1a;240 标注类别…

银河麒麟操作系统通过首批软件供应链安全能力认证

麒麟软件产品供应链安全能力获双重肯定&#xff01;5月30日&#xff0c;经北京赛迪认证中心评估&#xff0c;银河麒麟高级服务器操作系统V10和银河麒麟桌面操作系统V10成为首批获得软件供应链安全能力认证产品&#xff0c;并在操作系统类产品中名列前茅。 软件供应链安全能力评…

2024年数字化经济与智慧金融国际会议(ICDESF 2024)

2024 International Conference on Digital Economy and Smart Finance 【1】大会信息 大会时间&#xff1a;2024-07-22 大会地点&#xff1a;中国成都 截稿时间&#xff1a;2024-07-10(以官网为准&#xff09; 审稿通知&#xff1a;投稿后2-3日内通知 会议官网&#xff1a;h…

Leetcode 力扣108. 代码测试用例测试结果测试结果108. 将有序数组转换为二叉搜索树 (抖音号:708231408)

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也将被视为正确…

mysql用户管理知识点

1、权限表 1.1、user表 1.1.1、用户列 Host、User、Password分别表示主机名、用户名、密码 1.1.2、权限列 决定了用户的权限&#xff0c;描述了在全局范围内允许对数据和数据库进行操作。 1.1.3、安全列 安全列有6个字段&#xff0c;其中两个是ssl相关的&#xff0c;2个是x509相…

使用API有效率地管理Dynadot域名,创建文件夹管理域名

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

mobaxterm怎么ssh连接

要使用 MobaXterm 进行 SSH 连接&#xff0c;请按照以下步骤操作&#xff1a; 1、首先&#xff0c;确保已经安装了 MobaXterm 软件。 你可以在官方网站&#xff08;https://mobaxterm.mobatek.net/&#xff09;上下载并安装它。 2、打开 MobaXterm 软件后&#xff0c;你会看…

新手快速上手IDEA【常用快捷键】

目录 一、常用二、进阶&#xff08;提高编码速度&#xff09;三、其他四、查找、替换与关闭最后 一、常用 说明快捷键复制代码ctrl c粘贴ctrl v剪切ctrl x撤销ctrl z反撤销ctrl shift z保存-save allctrl s全选-select allctrl a 二、进阶&#xff08;提高编码速度&a…

AB测试实战

AB测试实战 1、AB测试介绍&#x1f43e; 很多网站/APP的首页都会挂一张头图(Banner)&#xff0c;用来展示重要信息&#xff0c;头图是否吸引人会对公司的营收带来重大影响&#xff0c;一家寿险公司Humana设计了如下三张头图&#xff0c;现在需要决定使用哪一张放到首页&#x…

SSRF思路及步骤

什么是SSRF&#xff1f; SERVER SIDE REQUEST FORGERY的简写 因为服务器本身提供了资源获取相关的服务&#xff0c;在资源地址能够被用户控制时&#xff0c;将可能导致攻击者利用服务器身份获取预期外的资源的后果 危害&#xff1f; 条件满足的情况下&#xff1a;突破网络防…

electron-Vue: Module parse failed: Unexpected character ‘ ‘

​ electron-Vue项目中&#xff0c;我自己写了一个node的C扩展&#xff08;xx.node&#xff09;&#xff0c;然后在.vue文件里import它&#xff0c;然后运行npm run electron:serve&#xff0c;报错如下: ​​ electron-Vue打包默认使用webpack&#xff0c;默认情况下webpack没…

Android Coil的简单介绍及使用

前言&#xff1a; 本文是借鉴网上大佬的Coil相关技术文章及结合自己项目中的实际使用情况&#xff0c;对Coil作一个简单介绍。 简介&#xff1a; Coil是一个Android的图片加载框架库&#xff0c;是通过Kotlin协程的方式加载图片的&#xff0c;相对于Glide、Picasso、Fresco等…

AWVS+BP+XRAY三层联动扫描漏洞

1. 前言 本报告详细记录了使用AWVS&#xff08;Acunetix Web Vulnerability Scanner&#xff09;、Burp Suite和Xray进行的漏洞扫描结果。旨在帮助开发团队识别和修复系统中的安全漏洞&#xff0c;提升整体安全性。 2. 扫描工具简介 AWVS&#xff08;Acunetix Web Vulnerabi…

公钥身份验证被拒绝

vim /etc/ssh/sshd_config 确保以下选项设置如下&#xff1a; PermitRootLogin no PubkeyAuthentication yes 注释掉GSSAPI 相关的选项 #GSSAPIAuthentication yes #GSSAPICleanupCredentials no 确保该UsePAM行设置为yes&#xff1a; UsePAM yes 保存文件并重启 sshd 服…