泛型编程的启蒙之旅

 

个人主页:日刷百题

系列专栏〖C/C++小游戏〗〖Linux〗〖数据结构〗 〖C语言〗

🌎欢迎各位点赞👍+收藏⭐️+留言📝 

讲模板之前呢,我们先来谈谈泛型编程:

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。
模板分为两类:函数模板类模板

一、函数模板

1.1 函数模板概念

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

1.2 函数模板格式

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

举例: 

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

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

1.3 函数模板的原理

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器。

                        

 在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。

1.4  函数模板的实例化

用不同类型的参数使用函数模板时,称为函数模板的实例化 。 模板参数实例化分为:隐式实例化显式实例化

1.4.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;
    Add(a1, a2);
    Add(d1, d2);
    
    return 0;
}
  • 这里Add(a1, a2)与Add(d1, d2)都是隐式实例化,编译器会根据实参推出实际类型。

我们再来看一段代码:

template<class T>
T Add(const T& left, const T& right)
{
	return left + right;
}
 
int main()
{
	int a = 1;
	double b = 1.1;
	Add(a, b);
 
	return 0;
}
  • 该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演其实参类型
  • 通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有一个T, 编译器无法确定此处到底该将T确定为int 或者 double类型而报错

注意:在模板中,编译器一般不会进行类型转换操作,因为一旦转化出问题,编译器就需要背黑锅 Add(a, b)。

这里要解决这样的问题有两种方式:

1. 用户自己来强制转化;

2. 使用显式实例化。

//强制类型转换
int main()
{
	int i = 1;
	double d = 1.1;
	Add(i, (int)d);
 
	return 0;
}
1.4.2 显式实例化

显式实例化是在函数名后的<>中指定模板参数的实际类型

template<class T>
T Add(const T& left, const T& right)
{
	return left + right;
}
int main()
{
	int i = 1;
	double d = 1.1;
	Add<int>(i, d);// 显式实例化为int
	Add<double>(i, d);// 显示实例化为double
 
	return 0;
}
  • 如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。

举例如下:

#include<iostream>
using namespace std;
template<class T>
T Add(const T& left, const T& right)
{
	return left + right;
}
int main()
{
	cout << Add<int>(1, "1") << endl;
	return 0;
}

1.5 模板参数的匹配原则

  • 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数
#include<iostream>
using namespace std;
// 专门处理int的加法函数
int Add(int left, int right)
{
	return left + right;
}
// 通用加法函数模板
template<class T>
T Add(T left, T right)
{
	return left + right;
}
int main()
{
	   // 与非模板函数匹配,编译器不需要特化
	Add(1, 2) ;
	   // 调用编译器特化的Add版本
	Add<int>(1, 2);
    return 0;

}
  • 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板
// 专门处理int的加法函数
int Add(int left, int right)
{
	return left + right;
}
// 通用加法函数
template<class T1, class T2>
T1 Add(T1 left, T2 right)
{
	return left + right;
}
void Test()
{
	Add(1, 2); // 与非函数模板类型完全匹配,不需要函数模板实例化
	Add(1, 2.0); // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的Add函数 
}
  • 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

二、类模板

2.1 类模板的定义格式

template<class T1, class T2, ..., class Tn>
class 类模板名
{
	// 类内成员定义
};

举例如下:

template<class T>
class stack
{
public:
	stack();//声明,在类外面定义
 
	~stack()
	{
		delete[] _a;
		_top = _capacity = 0;
	}
private:
	T* _a;
	int _top;
	int _capacity;
};
 
// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template<class T>
stack<T>::stack()
	: _a(nullptr)
	, _top(0)
	, _capacity(0)
{}

2.2 类模板的实例化

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode热题100】98. 验证二叉搜索树(二叉树)递归阶段总结1

一.题目要求 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 二.题目难度…

Keycloak介绍

1.什么是Keycloak Keycloak是一个开源的身份和访问管理解决方案&#xff0c;它提供了单点登录&#xff08;SSO&#xff09;功能。 Keycloak 支持多种标准协议&#xff0c;包括 OpenID Connect 和 OAuth 2.0&#xff0c;这使得它能够与各种服务进行集成&#xff0c;以提供身份…

几个常用的AI工具

人工智能大模型的出现对人类社会产生了深远的影响&#xff0c;这些影响既包括积极的方面&#xff0c;也包括一些潜在的挑战: 1. **提高效率**&#xff1a;AI大模型能够快速处理大量数据&#xff0c;提高工作效率&#xff0c;尤其在数据分析、自然语言处理等领域。 2. **辅助决…

Spring - AOP/事务 实现原理

AOP 基本概念 官方文档&#xff1a; Aspect Oriented Programming with Spring Spring AOP supports the following AspectJ pointcut designators (PCD) for use in pointcut expressions: within - limits matching to join points within certain types (simply the exec…

怎么建设数据中台?详解数据中台架构内的三大平台

一、什么是数据中台&#xff1f; 要知道“中台”是什么&#xff0c;就得先了解“前台”和“后台”。 前台&#xff0c;就是我们日常使用的过程中可以直接看到和感知到的东西&#xff0c;比如你打开某东app买了个3080显卡&#xff0c;在这个过程中你看到的页面以及搜索、点击详…

考研数学|武忠祥高数全年学习包分享

u1s1&#xff0c;武忠祥老师的课程真的不错&#xff0c;宝藏级老师 其实我觉得没必要对比每一个考研数学老师&#xff0c;汤家凤还有张宇以及武忠祥都是非常受欢迎的老师&#xff0c;也都很有实力&#xff0c;只不过讲课的风格有所区别。 比如汤家凤老师就像是高中那种不苟言…

洁净环境监测相关法规指南汇总

一 洁净级别确认 1. 用于生产无菌药品的洁净室和洁净空气设备如单向流系统&#xff08;UDAF&#xff09;、限制进入屏障系统&#xff08;RABS&#xff09;和隔离器&#xff0c;应根据所需环境特性进行确认。生产操作需要在适当洁净度级别的环境中进行&#xff0c;以降低粒子或…

M1 mac安装 Parallels Desktop 18 激活

M1 mac安装 Parallels Desktop 18 激活 下载安装Parallels Desktop 18.1.1 (53328) 激活1. 拷贝prl_disp_service2. 在终端打开Crack所在位置3. 输入命令&#xff0c;激活成功 下载 安装包和激活文件下载地址 链接: https://pan.baidu.com/s/1EjT7xeEDcntIIoOvvhBDfg?pwd9pue …

智能无人集群系统跨域协同技术研究现状与展望

源自&#xff1a;中国工程院院刊 作者&#xff1a;江碧涛&#xff0c;温广辉&#xff0c;周佳玲&#xff0c;郑德智 “人工智能技术与咨询” 发布 编者按 随着智能化技术和无人系统技术的快速发展&#xff0c;智能无人集群系统跨域协同的概念应运而生并得到了广泛关注与深…

element-ui radio-group 组件源码分享

接着上篇的 radio 组件源码分享&#xff0c;继续探索 radio-group 源码部分的实现过程&#xff0c;主要从以下四个方面来讲解&#xff1a; 1、el-radio-group 页面结构 2、el-radio-group 组件属性 3、el-radio-group 组件方法 4、核心代码部分 一、页面结构&#xff0c;如…

成都伊理威:抖音开网店如何找好货源

在数字浪潮的推动下&#xff0c;抖音已成为创业者开展电子商务的热土。开设一家抖音网店&#xff0c;如何找寻优质的货源成为成功的关键一环。选择货源&#xff0c;犹如为网店插上腾飞的翅膀&#xff0c;既要注重品质&#xff0c;也要考虑成本&#xff0c;确保产品能够在激烈的…

jspssm_maven项目——KTV点歌系统

目录 背景 技术简介 系统简介 界面预览 背景 随着互联网的广泛渗透和进步&#xff0c;基于网络技术的KTV点歌系统迅速壮大&#xff0c;其发展始终围绕用户的实际需求展开。通过深入洞察用户的需求&#xff0c;开发出高度定制的管理平台&#xff0c;利用网络的便捷性对系统…

【晴问算法】入门篇—字符串处理—首字母大写

题目描述 给定一堆用空格隔开的英文单词&#xff0c;将每个单词的首字母改为大写后输出。输入描述 一堆英文单词&#xff0c;每个单词不超过10个字符&#xff0c;且仅由小写字母组成;每两个单词之间用一个空格隔开&#xff0c;整个字符串的长度不超过1000。输出描述 输出每个单…

基于React的低代码平台开发实践

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;在线地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

浏览器输入框自动填充默认样式移除

文章目录 浏览器输入框自动填充默认样式移除问题现象以及探索过程尝试代码有效关键代码&#xff08;解决方案&#xff09; 浏览器输入框自动填充默认样式移除 问题现象以及探索过程 &#xff08;在 uniapp 语法下&#xff09;本文的写法在 Edge 119.0.2151.58 (正式版本) (64 …

爱校对:网站内容的温暖守护者

在这个快速变化的信息时代&#xff0c;网站如同一个生动的生态系统&#xff0c;每时每刻都在更新和进化。但是&#xff0c;随之而来的是一个挑战&#xff1a;如何确保这个生态系统中的每一条信息都是准确、合法、并且对用户友好呢&#xff1f;这就是我们&#xff0c;爱校对网站…

​企业是否需要向个人信息主体提供《标准合同》副本文件?​

企业是否需要向个人信息主体提供《标准合同》副本文件&#xff1f; 目前未见有规定强制要求企业需要主动向个人信息主体提供《标准合同》的副本文件&#xff0c;但个人信息主体具有要求个人信息处理者提供其所签订的《标准合同》副本的权利&#xff0c;企业必须配合。在提供副…

Jetson AGX ORIN 配置 FGVC-PIM 神经网络(包含 arm64 下面 torch 和 torchvision 配置内容)

Jetson AGX ORIN 配置 FGVC-PIM 神经网络 文章目录 Jetson AGX ORIN 配置 FGVC-PIM 神经网络配置 ORIN 环境创建 FGVC-PIM 虚拟环境安装 PyTorch安装 torchvision安装其他依赖包 配置 ORIN 环境 首先先配置 ORIN 的环境&#xff0c;可以参考这个链接&#xff1a; Jetson AGX …

【考研数学】张宇全程学习包

可以全程张宇老师的高等数学&#xff0c;张宇老师的拿手绝活是高数 但是其他科目&#xff0c;还有更好的选择&#xff0c;比如线性代数&#xff0c;汤家凤老师还有李永乐老师讲的都不错&#xff0c;概率论&#xff0c;余丙森老师还有方浩老师讲的很好。下面我就讲清楚&#xf…

1978-2022年全国及31省市农业机械总动力(万千瓦)(无缺失)

1978-2022年全国及31省市农业机械总动力&#xff08;万千瓦&#xff09;&#xff08;无缺失&#xff09; 1、时间&#xff1a;1978-2022年 2、范围&#xff1a;全国及31省 3、来源&#xff1a;整理自各省年鉴 中国农业统计年鉴、国家统计局 4、指标&#xff1a;农业机械总动…