让你认识C++中的模板

目录

  • 一. 泛型编程
    • 1、定义
  • 二、函数模板
    • 1、定义
    • 2、格式
    • 3、函数模板的实例化
      • (1)、强制转化
      • (2)、显式实例化
  • 三、类模板
    • 1、 类模板的定义格式
    • 2、实例
    • 3、 类模板的实例化

一. 泛型编程

1、定义

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

首先我们看这样一个代码:

#include<iostream>
void Swap(int& a, int& b) {
	int tmp = a;
	a = b;
	b = tmp;
}
void Swap(float& a, float& b) {
	float tmp = a;
	a = b;
	b = tmp;
}
void Swap(char& a, char& b) {
	char tmp = a;
	a = b;
	b = tmp;
}
int main() {
	int a = 1;
	int b = 2;
	Swap(a, b);
	cout << a << b << endl;
	float c = 3.3;
	float d = 2.2;
	Swap(c, d);
	cout << c << d << endl;
	char e = 'c';
	char f = 'd';
	Swap(e, f);
	cout << e << f << endl;
	return 0;
}

这个代码中的三个函数是不是,重复的地方非常多,除了参数的类型不同之外其他的地方几乎都是相同的。那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?
我们可以用函数模板来解决这个问题。

二、函数模板

1、定义

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

2、格式

#include<iostream>
using namespace std;
template<typename T>
void Swap(T& a, T& b) {
	T tmp = a;
	a = b;
	b = tmp;
}
int main() {
	int a = 1;
	int b = 2;
	Swap(a, b);
	cout << a << b << endl;
	float c = 3.3;
	float d = 2.2;
	Swap(c, d);
	cout << c << d << endl;
	char e = 'c';
	char f = 'd';
	Swap(e, f);
	cout << e << f << endl;
	return 0;
}
}

我们可以用这一个函数模板来代替上面代码的三个函数包括其他类型。

其中template是用来声明模板的关键字typename是用来定义模板参数关键字,也可以使用classT就是类型名称,可以自己随意命名。

3、函数模板的实例化

如果我们遇到下面的代码我们还可以运行么?

#include<iostream>
using namespace std;
template<typename T>
T Add(T a, T b) {
	T c = 0;
	c = a + b;
	return c;
}
int main() {
	int c = 1;
	float d = 2.2;
	cout << Add(c, d) << endl;
	return 0;
}

在这里插入图片描述

这时他就会报错,因为两个参数的类型不同,就推导不出来T的类型。那么我们怎么解决这个问题,有以下两种方法:

(1)、强制转化

#include<iostream>
using namespace std;
template<typename T>
T Add(T a, T b) {
	T c = 0;
	c = a + b;
	return c;
}
int main() {
	int c = 1;
	float d = 2.2;
	cout << Add(c,(int)d) << endl;//强制转化
	return 0;
}

将float类型转化为int类型,或者也可以将int类型转化为float类型。

(2)、显式实例化

#include<iostream>
using namespace std;
template<typename T>
T Add(T a, T b) {
	T c = 0;
	c = a + b;
	return c;
}
int main() {
	int c = 1;
	float d = 2.2;
	cout << Add<int>(c,d) << endl;
	return 0;
}

上面是将参数类型全部显示实例化转化为int类型,当然也可以转化为float类型。<>中间是模板参数的实际类型。

三、类模板

1、 类模板的定义格式

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

2、实例

template<class T>
class Stack
{
public:
	Stack(int capacity = 4)
	{
		_a = new T[capacity];
		_top = 0;
		_capacity = capacity;
	}

	~Stack()
	{
		delete[] _a;
		_a = nullptr;
		_top = 0;
		_capacity = 0;
	}
private:
	T* _a;
	int  _top;
	int  _capacity;
};

这里我们在每一次定于栈的时候如果我们想修改”_a“的类型是不是每一次都得对"_a"的类型进行修改。那么我们用了类模板是不是不用再对”_a“的类型再进行修改了,编译器直接就会帮助我们进行推导。

3、 类模板的实例化

函数模板可以进行显示实例化,类模板也可以进行显示实例化。

int main{
	Stack<int> st1;  // int
	Stack<double> st2;  // double
	return 0;
	}

这样我们就可以定义不同类型的对象了。

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

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

相关文章

电大搜题:为湖北开放大学学子提供便捷学习辅助工具

湖北开放大学作为一所具有重要社会影响力的学府&#xff0c;为广大在职人士和学习追求者提供了便利的高等教育机会。然而&#xff0c;在学习过程中&#xff0c;同学们常常会遇到繁重的课业压力和难以解决的学习难题。为了解决这一问题&#xff0c;湖北开放大学与广播电视大学合…

页表和cache

页表基本原理 页表主要用来将虚拟地址映射到物理地址&#xff0c;在使用虚拟地址访问内存时&#xff0c;微处理器首先将虚拟地址拆分成页号和页内偏移量&#xff0c;然后使用页号在页表中查找对应的物理页框号&#xff0c;将物理页地址加上页内偏移量&#xff0c;得到最终的物…

STM32 LED编程 GPIO的初始化(标准库)

实验的电路图介绍 实验的电路图类似于开漏接法 要初始化GPIOC接口 标准库的模板 GPIO的标准库编程接口 GPIO引脚的初始化 GPIO作为片上外设 每一个片上外设使用前一定要使能时钟 为什么要使能时钟&#xff1f;时钟是啥 时钟的使能 stm32的每一个片上外设都是时序电路 时序…

element-ui的form校验失败

数值与字符串混淆 数值 <el-input type"number" v-model.number"form.averageFruitWeight" placeholder"请输入平均单果重"/>字符串 fruitDevelopmentStage: [{pattern: ^[-\\]?([0-9]\\.?)?[0-9]$, message: 输入必须为数字, trigge…

AI由许多不同的技术组成,其中一些最核心的技术如下

AI由许多不同的技术组成&#xff0c;其中一些最核心的技术包括&#xff1a; 机器学习&#xff1a;这是一种让计算机从数据中学习的技术&#xff0c;它可以根据已有的数据预测未来的趋势和行为。机器学习包括监督学习、无监督学习和强化学习等多种类型。深度学习&#xff1a;这…

出现“线程无法访问非本线程创建的资源”的错误

出现原因 在WinForm中&#xff0c;如果你尝试在一个线程上操作另一个线程创建的控件&#xff0c;就会出现“线程无法访问非本线程创建的资源”的错误。这是因为Windows窗体的设计原则是单线程模型&#xff0c;即只有创建该控件的线程才能对其进行操作。 解决方法 1.使用 Contr…

【星海随笔】SDN neutron (一)

一、SDN的原理&#xff1a; 控制平面与数据平面分离&#xff1a;传统网络中&#xff0c;网络设备同时承担控制和数据转发功能&#xff0c;而SDN将这两个功能分离&#xff0c;使得网络控制集中在一个中心控制器上。 中心控制器&#xff1a;SDN架构中的中心控制器负责网络的全局…

强化学习 - 策略梯度(Policy Gradient)

引言 强化学习常见的方法为基于值函数或者基于策略梯度。 值函数&#xff1a;值函数最优时得到最优策略&#xff0c;即状态s下&#xff0c;最大行为值函数maxQ(s,a)对应的动作。 但对于机器人连续动作空间&#xff0c;动作连续时&#xff0c;基于值函数&#xff0c;存在以下问…

C语言C位出道心法(五):内存管理

C语言C位出道心法(一):基础语法 C语言C位出道心法(二):结构体|结构体指针|链表 C语言C位出道心法(三):共用体|枚举 C语言C位出道心法(四):文件操作 C语言C位出道心法(五):内存管理 一:C语言内存管理认知 二:C语言中内存堆|栈认知 三:C语言中引用内存丢失认知

秋招进入尾声了,还有哪些公司和岗位可以投递?

24届秋招基本已经进入尾声了&#xff0c;接下来就是秋招补录了&#xff0c;最近在微信群看到一些同学再问哪些公司还在招人的。 在这里跟大家分享一份2024届秋招信息汇总表&#xff0c;目前已更新2000家&#xff0c;不仅有互联网公司&#xff0c;还有外企、国企、各类研究所&am…

使用WinDbg分析CPU100%的问题

在我们软件运行的时候&#xff0c;偶尔会出现CPU占比100%的问题&#xff0c;而且极其不容易排查&#xff0c;概率极低&#xff0c;我硬是操作了一个下午&#xff0c;出现了一次&#xff0c;然后找到了dmp文件&#xff0c;也没有任何的规律&#xff0c;那么就可以借助windbg进行…

轻松下载网页音频和视频

在网页上看到好看的视频或者听到的音乐想保存&#xff0c;让我来教你&#xff08;仅供学习&#xff09; 注意&#xff1a;有极少部分的网站视频经过加密&#xff0c;无法下载 一、视频下载 1.打开视频网页 2.右键“检查” 3.刷新网页 4.按照下图中步骤操作 5.把复制的链接放…

如何利用产品帮助中心提升用户体验

在当今竞争激烈的市场中&#xff0c;提供优秀的用户体验是吸引和保留客户的关键。而一个高效和易于使用的产品帮助中心&#xff0c;正成为越来越多企业用以提升用户体验的重要工具。产品帮助中心是一个集中的信息库&#xff0c;为用户提供关于产品功能、故障排除、常见问题解答…

11.10

.text .global _start _start: 1.RCC时钟使能GPIOE RCC_MP_AHB4ENSETR[4]->1 LDR R0,0x50000a28 LDR R1,[R0] ORR R1,R1,#(0x3<<4) ORR R1,R1,#(0x1<<1) STR R1,[R0] 2.设置PE10为输出模式 GPIOE_MODER[21:20]->01 先清0 LDR R0,0x50006000 LDR R1,[R0]…

思科C9300交换机堆叠

思科C9300交换机堆叠仅支持同质堆叠&#xff0c;即仅以Cisco Catalyst 9300系列交换机作为堆叠成员的Cisco Catalyst 930O系列交换机堆叠。需要专用电缆&#xff0c;除数据交接支持堆叠外&#xff0c;还支持电源的堆叠。 在所有交换机上运行命令 "switch convert mode sta…

金融帝国实验室(Capitalism Lab)官方正版游戏『最新销售政策』

「金融帝国实验室」&#xff08;Capitalism Lab&#xff09;Enlight 官方正版游戏「2023双11特卖」 ■优惠时限&#xff1a;2023.11.01&#xff5e;11.30 ■游戏开发商&#xff1a;Enlight Software Ltd. 请您认准以下官方正版游戏购买链接&#xff1a;支持“支付宝&am…

如何在苹果iOS系统ipa应用中获取当前版本号和Bundle ID

在iOS应用开发过程中&#xff0c;了解如何获取和使用应用的当前版本号、Bundle ID和其他相关信息是至关重要的。无论是在应用内显示这些信息&#xff0c;还是在编写一些版本依赖的逻辑时&#xff0c;掌握这些知识点都将帮助开发者进行更有效的管理和维护。本文将详细介绍如何在…

数据分析是什么?

第一章- 数据分析是什么 数据分析是指 根据分析目的&#xff0c;用适当的分析方法及工具&#xff0c;对数据进行分析&#xff0c;提取有价值的信息&#xff0c;形成有效结论的过程。 数据分析的作用 通过观察数据&#xff0c;知道当前发生什么&#xff1f;通过具体的数据拆解…

Matplotlib数据可视化综合应用Matplotlib图形配置在线闯关_头歌实践教学平台

Matplotlib数据可视化综合应用图形配置 第1关 配置颜色条第2关 设置注释第3关 自定义坐标刻度第4关 配置文件与样式表 第1关 配置颜色条 任务描述 本关任务&#xff1a;使用colorbar绘制一个热成像图。 编程要求 在右侧编辑器Begin-End处补充代码&#xff0c;根据输入数据绘制…

【编程语言发展史】Go语言的发展历史

目录 Go的起源 Go语言发展时间轴 logo Go的起源 Go 语言起源 2007 年&#xff0c;并于 2009 年正式对外发布。它从 2009 年 9 月 21 日开始作为谷歌公司 20% 兼职项目&#xff0c;即相关员工利用 20% 的空余时间来参与 Go 语言的研发工作。该项目的三位领导者均是著名的 …