【C++】泛型编程 _函数模板和类模板的基本使用

news2024/11/23 8:14:19

1.泛型编程

如何实现一个通用的交换函数?这在C语言中是无法实现的,但是C++却可以。
C语言一次只能实现一个类型的交换:

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;
}

使用函数重载虽然可以实现,但是有一些问题:只要交换的类型不同,就需要增加对应的函数;重载的函数只是类型不同,代码复用率比较低;代码可维护性较低,一个函数出错所有重载都会出错。
解决这些问题的简单方法就是使用泛型编程。
泛型编程:编写与类型无关的通用代码,从而实现代码的复用。
像古代的活字印刷术,只要有了一个模板,就可以反复的造轮子;
在这里插入图片描述
C++中的模板可以分为函数模板和类模板。

2.函数模板

2.1 函数模板概念

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

2.2函数模板格式

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

由于函数模板的模板参数类型可以有多个,所以这里使用T1, T2 … Tn来标识。
typename后面的类型名T1,T2……是随便取的,但是要尽量做到见名知意,一般首字母大写。
使用函数模板定义一个通用的交换函数:

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

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

2.3 函数模板的原理

在这里插入图片描述
下面从汇编语言看一下,当不同类型的变量调用Swap函数的时候调用的是不是同一份:
在这里插入图片描述
不同的类型编译器会推演出不同的函数,调用的也就是不同的函数。
交换函数使用的频率还是很高的,C++库(在std命名空间中)中有一个交换函数swap是可以直接使用的。

2.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);
	//Add(a1, d1);  编译报错
	return 0;
}

在编译期间,当编译器看到该实例化时,需要推演其实参类型通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有一个T,编译器无法确定此处到底该将T确定为int 或者 double类型而报错。
2. 显式实例化:在函数名后的<>中指定模板参数的实际类型。

int main()
{
	int a = 10;
	double b = 20.0;
	Add<int>(a, b);
	return 0;
}

2.5 模板参数的匹配原则

模板函数使得我们的代码更简洁,但是也有着匹配规则,下面看这样一段代码:

int Add(int left, int right)
{
	return left + right;
}

template<class T>
T Add(T left, T right)
{
	return left + right;
}

template<class T1, class T2>
T1 Add(T1 left, T2 right)
{
	return left + right;
}

两个函数模板同时出现,还有一个处理int类型的函数,下面看一下调用规则:

Add(1, 2); // 与非模板函数匹配,编译器不需要实例化模板,直接调用
Add<int>(1, 2); // 显示实例化
Add(1, 2.0);//需要实例化两个类型参数的模板
Add(1.0, 2.0); //优先实例化一个类型参数的模板

3.类模板

相比于函数模板,类模板并没有特殊的地方,只是类模板只能显示实例化
下面以一个栈(Stack)为例:

typedef int STDataType;
class Stack
{
private:
	STDataType* _a;
	int top;
	int capacity;
};

数据类型是使用typedef进行重命名的,那么要想同时存储两种数据类型,还需要写一份完全一样的代码,只是类型不同;这样的话就很麻烦,所以使用到了类模板。

template<class T>
class Stack
{
private:
	T* _a;
	int top;
	int capacity;
};

这样编译器就可以根据不同的类型进行显示实例化。

int main()
{
	Stack<int> s1;
	Stack<char> s2;
	return 0;
}

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

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

相关文章

计算机毕设Python+Vue学生信息管理系统 (程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

关于小程序订单中心页设置的公告

为进一步规范小程序交易生态、提升用户购物体验、满足用户在有交易的小程序中便捷查看订单信息的诉求&#xff0c;自2022年12月31日起&#xff0c;对于有“选择商品/服务-下单-支付”功能的小程序&#xff0c;需按照平台制定的规范&#xff0c;在小程序内设置订单中心页。 开发…

创建DataFrame()对象--Pandas

1. DataFrame DateFrame对象是Pandas最常用的数据结构&#xff0c;是由不同类型的列组成的二维数据表结构&#xff0c;类似于EXCEL表&#xff0c;语法格式如下&#xff1a; pandas.DataFrame(dataNone, indexNone, columnsNone, dtypeNone, copyNone)1.1 函数参数:data 参数…

计算机操作系统笔记总结:Part2 进程与线程

文章目录1 进程1.1 进程的概念、组成与特征1.2 进程的状态与转换1.3 进程的组织1.4 进程控制1.5 进程通信2 线程与多线程模型2.1 线程的概念2.2 线程的实现方式2.3 多线程模型2.4 线程的状态与转换3 处理机调度3.1 调度的三个层次3.2 进程的挂起态与七状态模型3.3 进程调度3.3.…

[附源码]Nodejs计算机毕业设计健身房预约平台Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

【浙工商期末报告】研一Python期末作业B题(思路分享+源代码分享+原报告分享)

目录&#xff1a;研一Python期末作业B题&#xff08;思路分享&#xff09;一、题目介绍1.1 A题1.2 B题二、B题思路讲解2.1 问题的引入2.2 不平衡数据集2.2.1 不平衡数据的实例2.2.2 不平衡数据集导致的问题2.2.3 不平衡数据集的主要处理方法2.2.4 不平衡&#xff08;均衡&#…

数据结构实验大作业(将之前预测ACM获奖的模型搬到Vue和django上)

目录 前言 成品展示&#xff08;UI写的确实有点糊弄&#xff0c;太懒了不想弄了&#xff09; Vue部分 App.vue&#xff08;中间感觉还行&#xff0c;不算难看&#xff09; result组件&#xff1a; 路由&#xff1a; Django部分 view functionset&#xff08;自己建的&am…

Java岗最全面试攻略,吃透这些技术栈Offer拿到手软

前言 我分享的这份 Java 后端开发面试总结包含了 JavaOOP、Java 集合容器、Java 异常、并发编程、Java 反射、Java 序列化、JVM、Redis、Spring MVC、MyBatis、MySQL 数据库、消息中间件 MQ、Dubbo、Linux、ZooKeeper、 分布式 &数据结构与算法等 25 个专题技术点&#xff…

重学React之高阶函数(Higher Order Function)

高阶函数(Higher Order Function) “把函数传给一个函数,返回另一个函数”,就是高阶函数。 高阶函数是一个常见的函数,它接受其他函数作为参数,然后返回一个函数。听起来很绕,但是这是个很常见的模式,比如有一个ajax函数,可以传一个callback作为处理函数,然后调用的地…

设计模式原则 - 里氏替换原则(四)

一 背景&#xff1a; 里氏替换原则是针对继承的。介绍前先聊聊继承性的特点 继承优势 提高代码的复用性&#xff08;每个子类有拥有父类的属性和方法&#xff09;提高代码的可扩展性 继承劣势 继承是侵入性的&#xff08;只要继承&#xff0c;就必须拥有父类的属性和方法&…

Linux中的Chrony时间同步服务

目录 一、时间同步 1.概念 2.时间同步在运维工作中的作用 3.时间同步完成方法 &#xff08;1&#xff09;NTP时间服务&#xff08;centos 6 &#xff09; &#xff08;2&#xff09;Chrony时间服务 二、Chrony时间服务 1.Chrony介绍 2.Chrony的优点 三、Chrony安装 …

linux基础学习-基本命令

基本命令 拷贝和移动 tree[目录名]&#xff1a;以树状图列出文件目录结构 -d&#xff1a;只显示目录cp 源文件 目标文件&#xff1a;复制文件或者目录 -f&#xff1a;已存在的目标文件直接覆盖&#xff0c;不会提示-i&#xff1a;覆盖文件前提示-r&#xff1a;若给出的源文件是…

SQLMAP高级用法

目录 前言 一、语法 1.利用google浏览器进行批量扫描 2.针对http请求头进行扫描 3.写入shell的几种方法 4.挂代理的方式 二、演示 1.批量扫描谷歌代理 2.http请求ua扫描 3.写入shell&#xff08;一&#xff09; 4.写入shell&#xff08;二&#xff09; 三、小结 前…

[附源码]计算机毕业设计Python的花店售卖系统的设计与实现(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

Windows与网络基础 | 管理_NTFS_注册表... | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘Windows与网络基础 该笔记特点是 重新整理了涉及资料的一些语言描述、排版而使用了自己的描述对一些地方做了补充说明。比如解释专有名词、类比说明、对比说明、注意事项提升了总结归纳性。尽可能在每个知识点上都使用一句话 || 关键词概括更注重在实际上怎么…

【毕业设计_课程设计】在线免费小说微信小程序的设计与实现(源码+论文)

文章目录0 项目说明1 系统介绍1.1 业务层面1.2 产品层面1.3 技术层面2 项目运行3 项目截图3.1 小程序3.2 后台管理系统3.3 论文概览4 项目源码0 项目说明 在线免费小说微信小程序的设计与实现 提示&#xff1a;适合用于课程设计或毕业设计&#xff0c;工作量达标&#xff0c;…

word页码如何设置为章节加页码,例如第一章第一页1-1、第二章第一页2-1

由于用到word页码分章节页码的形式&#xff0c;从网上查了一下&#xff0c;质量真的很差&#xff0c;没有一篇文章讲清楚的&#xff0c;有的所答非所问&#xff0c;一怒之下&#xff0c;利用几个小时的时间解决问题并写下这篇文章&#xff0c;以供大家学习参考&#xff01;&…

如何多台OAK设备同时RTSP推流?

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是助手…

世界杯结束了,但盼盼的“世界杯”才刚刚开始

体育的魅力是什么&#xff1f; 有人说体育的魅力在于感染力&#xff0c;在于惊险时刻带来的心跳反应。也有人说&#xff0c;体育的魅力源自于——体育不止于体育本身。所谓体育&#xff0c;实则更像是一卷不会完卷的英雄史诗&#xff0c;记录着无数运动员的高光时刻也承载着数…

grafana监控oceanbase-obagent部署

1.Install ob-deploy in obd server(obdserver can be a ocp server) (1)download newest version of ob-deploy and obagent,upload them to /soft directory oceanbase-community-stable-el-7-x86_64安装包下载_开源镜像站-阿里云 (2) install obdeploy rpm -ivh ob-deplo…