让你认识C++中的模板

news2024/12/26 21:28:47

目录

  • 一. 泛型编程
    • 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;
	}

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

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

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

相关文章

Spring封装数据结果

Spring封装数据结果 POST请求JSON格式 基本数据类型 public class Demo {private byte aByte;private short aShort;private int anInt;private long aLong;private float aFloat;private double aDouble;private char aChar;private boolean aBoolean; }没有传键 封装时就会…

arm2 day4

汇编编写流水灯 代码&#xff1a; LED流水灯现象&#xff1a;

Aspose.OCR for .NET 2023Crack

Aspose.OCR for .NET 2023Crack 为.NET在图片上播放OCR使所有用户和程序员都可以从特定的图像片段中提取文本和相关的细节&#xff0c;如字体、设计以及书写位置。这一特定属性为OCR的性能及其在扫描遵循排列的记录时的功能提供了动力。OCR的库使用一条线甚至几条线来处理这些特…

思科C9300交换机堆叠

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

确定性 vs 非确定性:GPT 时代的新编程范式

分享嘉宾 | 王咏刚 责编 | 梦依丹 出品 | 《新程序员》编辑部 在 ChatGPT 所引爆的新一轮编程革命中&#xff0c;自然语言取代编程语言&#xff0c;在只需编写提示词/拍照就能出程序的时代&#xff0c;未来程序员真的会被简化为提示词的编写员吗&#xff1f;通过提示词操纵 …

Python使用Numba装饰器进行加速

Python使用Numba装饰器进行加速 前言前提条件相关介绍实验环境Numba装饰器进行加速未加速的代码输出结果 numba.jit加速的代码输出结果 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专栏、Ope…

windows下安装zookeeper及kafka

1、下载安装包 https://dlcdn.apache.org/zookeeper/zookeeper-3.9.1/apache-zookeeper-3.9.1-bin.tar.gz 2、下载kafka包 Apache Kafka 3、解压压缩包 4、进入zookeeper目录创建配置的数据目录data及配置的日志目录log 5、复制并配置zoo.cfg文件 6、启动zookeeper&#xff0…

Python数据容器(字符串)

字符串 1.字符串 字符串也是数据容器的一种&#xff0c;字符串是字符的容器&#xff0c;一个字符串可以存放任意数量的字符。 2.字符串的下标索引 从前向后&#xff0c;下标从0开始从后向前&#xff0c;下标从-1开始 # 通过下标索引获取特定位置的字符 name python print(na…

【数据结构】树的基本性质(计算树的总结点数与叶结点数)

树的基本性质 ⭐️计算树的总结点与叶结点数&#x1f4ab;性质1&#x1f4ab;性质2&#x1f4ab;例题1&#x1f4ab;例题2 ⭐️计算树的总结点与叶结点数 &#x1f4ab;性质1 性质1 树中的结点数等于所有结点的度数之和加1 例如上面这棵树&#xff0c;A的孩子为B、C、D&…

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

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

Java程序设计实验5 | Java API应用

*本文是博主对Java各种实验的再整理与详解&#xff0c;除了代码部分和解析部分&#xff0c;一些题目还增加了拓展部分&#xff08;⭐&#xff09;。拓展部分不是实验报告中原有的内容&#xff0c;而是博主本人自己的补充&#xff0c;以方便大家额外学习、参考。 &#xff08;解…

【Java 进阶篇】Java Web 开发之 Listener 篇:ServletContextListener 使用详解

欢迎大家来到 Java Web 开发的学习之旅&#xff01;在前面的博客中&#xff0c;我们已经学习了 Servlet、JSP、Filter 等重要的概念和技术。今天&#xff0c;我们将深入探讨 Java Web 开发中另一个重要的组成部分——Listener&#xff08;监听器&#xff09;&#xff0c;具体来…

18 CDN详解

1、理解CDN 1.CDN 和电商系统的分布式仓储系统一样&#xff0c;就近发货给客户(客户端)&#xff0c;所以&#xff0c;必然是提前在仓库中存储了某些商品. 2.CDN最擅长的是缓存静态数据&#xff0c;比如电商系统的热点静态页面&#xff0c;秒杀场景的页面等.问题&#xff1a;向…

Linux学习第37天:Linux I2C 驱动实验(一):哥俩好

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 世界上的很多事物都是成双成对出现的。也包括在驱动开发的过程中&#xff0c;比如I2C中其实就是数据线和时钟线的相互配合才能完成的。 I2C常用于连接各种外设、…

基于SSM的网络音乐系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

【Vue】【uni-app】工单管理页面实现

用的是uni-app的uni-ui拓展组件实现的 功能是对工单进行一个展示&#xff0c;并对工单根据一些筛选条件进行搜索 目前是实现了除了日期之外的搜索功能&#xff0c;测试数据是下面这个tableData.js&#xff0c;都是我自己手写的&#xff0c;后端请求也稍微写了一些&#xff0c;…

Windows上基于Tesseract OCR5.0官方语言库的LSTM字库训练

系列文章目录 Tesseract OCR引擎 文章目录 系列文章目录前言一、LSTM字库训练是什么&#xff1f;二、使用步骤1. 环境准备1.1下载Tesseract 程序并安装1.2下载Tesseract 训练字库1.3下载工具jTessBoxEditor 2. LSTM训练2.1 将要训练的图片(jpg/tif)合并成一个文件2.2 生成box文…

DreamScene2 免费WIndows 动态桌面壁纸播放软件启动无响应失败问题解决及安装使用帮助

高阶使用预览 启动失败场景还原 1. 系统信息 2. 启动错误描述 使用壁纸过程中突然出现异常卡断,使用任务管理器停止程序后,该程序就无法正常启动,点及启动后出现 转圈(任务管理器短暂出现进程) 后就消失不见 原因分析 经过推测后可能是 强制停止后 工作临时缓存目录与启动程序…

2023.11.10联赛 T3题解

题目大意 题目思路 感性理解一下&#xff0c;将一个数的平方变成多个数平方的和&#xff0c;为了使代价最小&#xff0c;这些数的大小应该尽可能的平均。 我们可以将 ∣ b i − a i ∣ |b_i-a_i| ∣bi​−ai​∣放入大根堆&#xff0c;同时将这个数划分的次数以及多划分一段减…

IDEA的这款API调试插件爱了

前言 Idea 是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序,Idea 还具有许多插件和扩展&#xff0c;可以根据开发人员的需要进行定制和扩展&#xff0c;从而提高开发效率,今天我们就来介绍一款…