函数模板(template关键字的应用)

news2025/7/19 4:59:02

注释:本文主要介绍了函数模板的由来以及用法,还有关键字template。
我们感到时间的延续像一条我们无法逆行的小溪。
——柏格森
在这里插入图片描述

文章目录

  • 一、语言的定式
  • 二、函数模板
    • 2.1 函数模板格式
    • 2.2 模板函数的实例化
      • 2.2.1隐式实例化/显式实例化
    • 2.3 模板参数的匹配原则
  • 三、类模板!
    • 3.1 类模板普遍格式
    • 3.2 类模板的实例化


一、语言的定式

生活中大多数产品都是制式的,都或多或少有他们各自的磨具用以加快产品的生产,但是我们发现之前在C语言中函数几乎是确定的除非我们改变函数本身的生命,类型与类型之前也不是互通的,这个时候如果想要实现不同类型变量之前的计算/交换等就要书写非常多冗余的函数。非常的不方便就拿一个Add函数来举例吧。

//两个int类相加
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
//两个浮点型相加
void Swap(double& left, double& right)
{
double temp = left;
left = right;
right = temp;
}
//两个字符类型相加
void Swap(char& left, char& right)
{
char temp = left;
left = right;
right = temp

这仅仅只是三种同类型数据的Add函数,会让我们的代码量指数上升。
有多少种类型就会有多少种Add,一旦不符合就会报错。
当然我们还可以使用函数重载来减少他们的数量,但是这还只是普通类型,还没有加入const类变量还没有加入其他的各种运算/判断等。
这时我们就需要有一个好像磨具一样的东西来只传输我们的参数,然后得到我们的结果。在C++中自然就引入了这个东西我们称之为模板

二、函数模板

函数模板代表的是一个函数类他与传入的类型无关,在使用的时候被参数化,根据实参类型产生函数的特定类型版本。

2.1 函数模板格式

template<typename T1, typename T2,…,typename Tn>
返回值类型 函数名(参数列表){}

 1.template<typename T>
 void Swap( T& left, T& right)
 {
 T temp = left;
 left = right;
 right = temp;
 }

注意:typename是用来定义模板参数关键字,也可以使用class。(切记:不能使用struct代替class)

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器。
它的底层也是编译器去通过模板生成对应的函数,并非C++ 引入了一种新的定义,是一种语法糖。

2.2 模板函数的实例化

当不同的类型的参数使用函数模板的时候,首先要进行函数的实例化。

2.2.1隐式实例化/显式实例化

//函数实例化
template<class T>
T Add(const T& left, const T& right)
{
return left + right;
}
//隐式实例化
int main(){
int a1 = 10, a2 = 20;
double d1 = 10.0, d2 = 20.0;
//函数传输的时候不进行类型署名,让编译器自己识别。
//下第一天编译就会报错,当我们把a1识别转化为<int>时,a2就会判定为double性不能进行相加,因为我们仅仅定义了一个T
Add(a1, a2);
Add(d1, d2);
}
//显式实例化
int main(void)
{
int a = 10;
double b = 20.0;
//直接进行强制转化,指定结果类型
Add<int>(a, b);
return 0;
}
//同时我们还可以直接进行类型转换比如
Add(a, (int)d);

2.3 模板参数的匹配原则

!一个模板参数可以和一个同名函数同时存在。

// 专门处理int的加法函数
int Add(int left, int right)
{
return left + right;
}
// 通用加法函数
template<class T>
T Add(T left, T right)
{
return left + right;
}
void Test()
{
Add(1, 2); // 与非模板函数匹配,编译器不需要特化
Add<int>(1, 2); // 调用编译器特化的Add版本
}

编译器是聪明的,当非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板。
就好像我们定义非模板函数与我们需要处理的数据在类型上完全一致,这时候编译器就会只能选择我们所定义的非模板函数。

三、类模板!

C++相对于C改变最大的一个方向就是函数类,在进行大的项目制作时,编程人员的思路往往是大相径庭的,这时候类模板的出现就弥补了很多。

3.1 类模板普遍格式

templete <class T>
class zyl{
public:
	zyl(size_t capacity=10)
	: _pData(new T[capacity])
	, _size(0)
	, _capacity(capacity)
	{
	}
	~Vector();

	void PushBack(const T& data);
	void PopBack();
	// ...
	size_t Size() {return _size;}

	T& operator[](size_t pos)
	{
		assert(pos < _size);
		return _pData[pos];
	}
private:
	T* _pData;
	size_t _size;
	size_t _capacity;
}
//类模板中函数在类模板外进行定义时,需要加上它对应的模板参数列表
template <class T>
zyl<T>::~zyl()
{
	if(_pData)
	delete[] _pData;
	_size = _capacity = 0;
}

3.2 类模板的实例化

与函数模板实例化不同,类模板的实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板的名字并不是真正的类,而实例化的类型才是真正的类。

// Vector类名,Vector<int>才是类型
Vector<int> s1;
Vector<double> s2;

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

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

相关文章

SQL注入——floor报错注入

目录 一&#xff0c;涉及到的函数 rand&#xff08;&#xff09; floor&#xff08;&#xff09; concat_ws() as别名&#xff0c;group by分组 count() 报错原理 一&#xff0c;涉及到的函数 rand()函数&#xff1a;随机返回0~1间的小数 floor()函数&#xff1a;小数向…

C/C++开发,无可避免的多线程(篇六).线程池封装类

一、线程池概念 线程池是一种多线程处理方式&#xff0c;它包含一个线程工作队列和一个任务队列。当有任务需要处理时&#xff0c;线程池会从线程工作队列中取出一个空闲线程来处理任务&#xff0c;如果线程工作队列中没有空闲线程&#xff0c;则任务会被放入任务队列中等待处理…

M1、M2芯片Mac安装虚拟机

目录前言一、安装二、网络设置三、连接SSH客户端前言 一直想着给M1 Mac上安装虚拟机&#xff0c;奈何PD收费&#xff0c;找的破解也不稳定&#xff0c;安装上镜像就起不来。 注&#xff1a;挂长久的分享莫名其妙被封&#xff0c;需要安装包请私信我。 一、安装 虚拟机选择&a…

一次惨痛教训让我写了个Windows定期备份文件脚本

目录前言正文前言 说实话在写这篇文章的时候&#xff0c;咸鱼不禁又想起了那件男默女泪的往事 我喜欢做笔记&#xff0c;我觉得好记性不如烂笔头&#xff0c;所以在我的学习生涯以及职业生涯阶段&#xff0c;我用过四款笔记应用——Onenote、语雀、印象笔记、Typora 其中我个…

Nacos配置中心,分组配置参考,以及python、go、bash客户端连接获取

Nacos使用说明 nacos官方网站 https://nacos.io/zh-cn/docs/v2/what-is-nacos.html 1、基本配置说明 nacosIP地址&#xff1a;http://xxxxx:8848/nacos/ 服务管理端登录账号&#xff1a;nacos XXX Java最小配置&#xff0c;其他客户端可参考&#xff0c;配置可对应到第三章…

【动态规划】

动态规划1引言题目509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯小结53. 最大子数组和结语引言 蓝桥杯快开始了啊&#xff0c;自从报名后还没认真学过算法有(>﹏<)′&#xff0c;临时抱一下佛脚&#xff0c;一起学学算法。 题目 509. 斐波那契数 斐波那契数 &am…

你来看看这几行代码到底创建了几个字符串?

&#x1f497;推荐阅读文章&#x1f497; &#x1f338;JavaSE系列&#x1f338;&#x1f449;1️⃣《JavaSE系列教程》&#x1f33a;MySQL系列&#x1f33a;&#x1f449;2️⃣《MySQL系列教程》&#x1f340;JavaWeb系列&#x1f340;&#x1f449;3️⃣《JavaWeb系列教程》…

Java中对象的finalization机制

本篇文章我们详细介绍Java中对象的finalization机制&#xff0c;以及怎么使用finalize()方法&#xff0c;将即将被回收的对象&#xff0c;拉回来。1、finalization机制Java语言提供了对象终止&#xff08;finalization&#xff09;机制来允许开发人员提供对象被销毁之前的自定义…

Spring的Async注解线程池扩展方案

目录- [Spring的Async注解线程池扩展方案]- [目录]- [1. 扩展目的]- [2. 扩展实现]- [2.1 扩展Async注解的执行拦截器AnnotationAsyncExecutionInterceptor]- [2.2 扩展Async注解的Spring代理顾问AsyncAnnotationAdvisor]- [2.3 扩展Async注解的 Spring Bean 后置处理器AsyncAn…

Linux安装及管理应用和账号和权限管理 讲解

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

不系统学习NodeJs之进程线程

不系统学习NodeJs之进程线程 从工作期间断断续续接触Node&#xff0c;从去年的3月份、10月份、又到今年的3月份&#xff0c;终于又决定要再仔细看看Node的相关。 不系统学习的各种时期笔记&参考记录于此。 参考&#xff1a; Node.js 中文网 一篇文章构建你的 NodeJS 知识…

BIC高颜值在线绘图新增颜色集合本地存储功能

用户可以把自己选择的颜色集合存储在自己浏览器本地(鼠标滑过颜色名字可以显示具体代表哪些颜色和色号)&#xff0c;供同一个工具的多套数据使用或者在不同工具之间共享颜色集合的使用&#xff0c;统一多张图一致的配色。最新访问地址&#xff1a;https://www.bic.ac.cn/BIC/ &…

JavaWeb—CSS

目录 &#xff11;、CSS 技术 &#xff11;.&#xff11;、CSS 技术介绍 &#xff11;.&#xff12;、CSS 语法规则&#xff1a; &#xff11;.&#xff13;、CSS 和 HTML 的结合方式 &#xff11;.&#xff13;.&#xff11;、第一种&#xff1a; &#xff11;.&#xf…

Iterator 迭代器

迭代器 为了兼顾 各个子类的特性 实现无差别可以 访问数据 举个例子 遍历数组和遍历链表 两者代码的写法不一样 为了实现 使用相同的代码 对不同的数据容器进行遍历 就出现了 迭代器 for语句的执行和 interator的实现息息相关 目的 访问各个类型 集合 的数据&#xff…

Spring源码解析-Spring 循环依赖

Spring源码解析简图&#xff1a; Spring 如何解决循环依赖&#xff0c;⽹上的资料很多&#xff0c;但是感觉写得好的极少&#xff0c;特别是源码解读⽅⾯&#xff0c;我就⾃⼰单独出⼀ 篇&#xff0c;这篇⽂章绝对肝&#xff01; 文章目录&#xff1a; 一. 基础知识 1.1 什么…

记录--elementui源码学习之仿写一个el-button

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 本篇文章记录仿写一个el-button组件细节&#xff0c;从而有助于大家更好理解饿了么ui对应组件具体工作细节。本文是elementui源码学习仿写系列的又一篇文章&#xff0c;后续空闲了会不断更新并仿写其他…

Unity iOS 无服务器做一个排行榜 GameCenter

排行榜需求解决方案一(嗯目前只有一)UnityEngine.SocialPlatformsiOS GameCenterAppStoreConnect配置Unity 调用(如果使用GameCenter系统的面板&#xff0c;看到这里就可以了&#xff09;坑(需要获取数据做自定义面板的看这里)iOS代码Unity 代码吐槽需求 需求&#xff1a;接入…

某某游戏加密坐标分析

这个游戏里面坐标有很多种存放方式。 例如明文存放的DOUBLE&#xff0c;加密的各种类型。 我们不知道哪一个对于我们是有用的,哪一些只是辅助UI或则掉到LUA虚拟机坑里的数据。 那就根据作用大小来决定,一一尝试吧。 最好去找修改之后有效果的地址&#xff0c;当然只是本地&…

记一次影视cms黑盒CSRF-RCE

俗话说得好&#xff0c;思路才是最重要&#xff0c;本文章主要提供思路&#xff0c;各位师傅在挖掘漏洞的时候说不定也能碰到类似的点1.思路&#xff1a;当我们在找可以构建csrf的时候&#xff0c;多找找可以提交上传图片的&#xff0c;部分是可以自由构建url如图&#xff1a;漏…

Python数据分析案例20——我国家庭资产影响因素分析

本次案例较为简单&#xff0c;符合人文社科、经济学管理学等专业本科生适用。 本文的数据来源于中国家庭金融调查&#xff08;China Household Finance Survey&#xff0c;CHFS&#xff09;是西南财经大学中国家庭金融调查与研究中心&#xff08;下称中心&#xff09;在全国范围…