【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;
}
相关推荐
gc_229910 分钟前
学习C#调用OpenXml操作word文档的基本用法(7:Style类分析-5)
学习·word·openxml
AA陈超13 分钟前
ASC学习笔记0014:手动添加一个新的属性集
c++·笔记·学习·ue5
xixixi7777739 分钟前
了解一下Sentry(一个开源的实时错误监控平台)
前端·安全·开源·安全威胁分析·监控·sentry
Run_Teenage43 分钟前
C++:智能指针的使用及其原理
开发语言·c++·算法
Chunyyyen44 分钟前
【第二十二周】自然语言处理的学习笔记06
笔记·学习·自然语言处理
Keely402851 小时前
学习编写chrome插件:Hello World 扩展
前端·chrome
hhcccchh2 小时前
学习vue第三天 Vue 前端项目结构的说明
前端·vue.js·学习
WX-bisheyuange2 小时前
基于Spring Boot的民宿预定系统的设计与实现
java·spring boot·后端·毕业设计
Shylock_Mister2 小时前
Linux C线程编程全指南
linux·运维·c语言
码界奇点2 小时前
Java设计模式精讲从基础到实战的常见模式解析
java·开发语言·设计模式·java-ee·软件工程