【C++】”如虎添翼“:模板初阶

泛型编程

C++中一种使用模板来实现代码重用和类型安全的编程范式。它允许程序员编写与数据类型无关的代码,从而可以用相同的代码逻辑处理不同的数据类型。模板是泛型编程的基础

模板分为两类:

  1. 函数模板:代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生 函数的特定类型版本

  2. 类模板

函数模板:

代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生 函数的特定类型版本

提供一个函数的模板,但是类型是不固定的,对于这种编程也叫泛型编程

复制代码
Template<typename T1, typename T2,......,typename Tn>//模板格式


template<typename T>//T是一个类型的名称,没有要求;typename是一个关键字,后面跟的是泛型类型的名字,typename也能换成class。typename T合起来就是一个模板参数
void Swap(T& left,T& right)
{
	T temp = left;
	left = right;
	right = temp;
}

template<typename T>
void Swap(T& left,T& right)
{
	T temp = left;
	left = right;
	right = temp;
}
int main()
{
	int x = 1, y = 2;
	double m = 1.1, n = 2.2;
	Swap(x,y);//这里两处函数调用,看似调用的是一个函数,但实际上时调用了两个函数(函数调用要建立栈帧,一个是int类型,一个double类型,类型大小都不一样,更不可能调用的是同一个函数了),这个可以从汇编层来观察
	Swap(m,n);
	return 0;
}

观察汇编代码发现,call的地址不一样,说明调用的不是同一个函数。

原理:

编译器通过你编写的模板,再根据你传入的参数,自行生成对应的函数,调用的就是这个编译器自行生成的函数

如果你传入两个参数,这两个参数的类型不一样,就需要写两个模板参数,否则编译会不通过

正确做法如下:

复制代码
template<typename T1, typename T2>
void Swap(T1&left,T2&right)
{
	T1 temp = left;
	left = right;
	right = temp;
}
int main()
{
	int x = 1, y = 2;
	double m = 1.1, n = 2.2;
	Swap(x,n);
	Swap(m,y);
	return 0;
}
相关推荐
沐苏瑶几秒前
Java据结构深度解析:AVL 树与红黑树
数据结构·算法
Godson_beginner几秒前
Aspose.PDF for Java(实现PDF转Word无水印无页数限制)
java·spring·pdf·文档转换
bcbobo21cn1 分钟前
Web 3D 正方体贴图
前端·3d·贴图·mesh
feifeigo1231 分钟前
MATLAB中对转子建立有限元模型并进行动力学计算
算法
Lsk_Smion1 分钟前
Sability安卓(三)_基础开发知识扫盲,开学XML......
android·java·android studio·安卓
老花眼猫2 分钟前
数学艺术图案画-曼陀罗(二)
c语言·经验分享·青少年编程·课程设计
网域小星球2 分钟前
C 语言从 0 入门(十九)|共用体与枚举:自定义类型进阶
c语言·开发语言·算法·枚举·自定义类型·共用体
灯光设计师3 分钟前
JavaScript判断受访域名,调用不同的js文件
javascript
indexsunny3 分钟前
互联网大厂Java求职面试实战:从Spring Boot到Kafka的技术问答解析
java·spring boot·spring cloud·kafka·flyway·hikaricp·microservices
聊聊MES那点事3 分钟前
报表控件Stimulsoft Reports.NET使用教程:发票报告设计
前端·javascript·html·报表工具