C++:模板(函数模板,类模板)

news2024/11/22 15:53:47

目录

泛型编程

函数模板

函数模板格式

函数模板的原理

函数模板的实例化

类模板

类模板格式

类模板实例化


模板分为函数模板和类模板

在C++中使用模板可以让我们实现泛型编程

泛型编程

如果我们需要实现一个加法add函数,那么会怎么实现呢?

int Add(int a, int b)
{
	return a + b;
}

 上面就是一种实现方法

但是它有严重的缺点,就是它的返回值和形参都是固定的,都是整型

如果我们还要写浮点型,那么我们还得多写一个函数

int Add(int a, int b)
{
	return a + b;
}

double Add(double a, double b)
{
	return a + b;
}

但是在C++中我们有模板,我们可以理解为这个Add函数就是模具,我们给它什么材料它就是什么材料 

所以如果是C++我们可以这样写

template<class T>
T Add(T a, T b)
{
	return a + b;
}

这就是函数模板 

函数模板

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

函数模板格式

上面的加法的模板就是一种简单的格式

template<class T>
T Add(T a, T b)
{
	return a + b;
}

首先要有template这个关键字, 后面跟上<>里面的class也是一个关键字,T就是一个类似于类型的东西,我们实例化出来的其他内置类型最后就会把这个T替换掉

这是比较常用的一种写法

当然我们也可以把class换成typename

template<typename T>
T Add(T a, T b)
{
	return a + b;
}

这两种写法效果都一样

也可以写多个模板

template<class T1, class T2, ..., class Tn>
void Add(T1 a, T2 b, ..., Tn n)
{
	//...
}

函数模板的原理

在编译的时候,如果我们在一个main函数里既写了整型的Add又写了浮点型的Add,那么这是两个函数还是一个函数呢?

答案是两个函数

相当于编译器帮我们写了两个函数,只是单纯的把模板T给推演成了其他的内置类型,如下图

 所以模板就相当于编译器帮我们做了我们原本要做的事情

当然了上面的Add函数其实写的都不是很好,我们不改变a和b的话可以加上const修饰,还可以加上引用减少拷贝,提高效率

template<class T>
T Add(const T& a, const T& b)
{
	return a + b;
}

函数模板的实例化

如果类型不匹配是会报错的 

template<class T>
T Add(const T& a, const T& b)
{
	return a + b;
}

int main()
{
	int a = 10;
	double d = 10.0;
	Add(a, d);
	return 0;
}

 

这里就是因为a和d的类型不一致导致报错

编译器识别出a是int类型,到模板里那个T就是int,但是后面的d是double,跟int匹配不上,所以自然就报错了 

解决方案 

template<class T>
T Add(const T& a, const T& b)
{
	return a + b;
}

int main()
{
	int a = 10;
	double d = 10.0;
	Add(a, (int)d);
	return 0;
}

可以像上面把d强转成int类型即可 

template<class T>
T Add(const T& a, const T& b)
{
	return a + b;
}

int main()
{
	int a = 10;
	double d = 10.0;
	Add((double)a, d);
	return 0;
}

或者是把a强转成double类型

template<class T>
T Add(const T& a, const T& b)
{
	return a + b;
}

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

也可以在函数名后面加上<类型>,相当于是告诉了编译器我要实例化一个int类型的Add,这样即使d的类型不匹配,进入函数后也会隐式类型转换成int

template<class T>
T Add(const T& a, const T& b)
{
	return a + b;
}

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

当然double也没问题,和前面的int原理一致  

类模板

之所以叫类模板就是在类中使用模板,

类模板格式

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

也就是在一个类中,我们可以使用多个类型

template<class T>
class Stack
{
public:
	Stack(size_t capacity = 4)
	{
		_array = new T[capacity];
		_capacity = capacity;
		_size = 0;
	}
	void Push(const T& data);
private:
	T* _array;
	size_t _capacity;
	size_t _size;
};

也就是说,例如我们写一个栈, 写了一个栈的模板出来,就相当于把所有内置类型的栈都写了出来,我们在函数内部想定义什么类型的栈就定义什么类型的栈,这是C语言办不到的

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

类模板实例化

上面的代码就是一个实例化

我们实例化出了一个int类型的栈和double类型的栈

因为我们使用一个类的时候不像函数一样可以传参从而让编译器缺定我们模板的类型是什么

所以我们在实例化一个类的时候需要加上<类型>来让编译器知道我们需要什么类型的模板,从而给我们实例化出来,就像上面函数模板中的a和d一样


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

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

相关文章

AI学习记录 - 规范化输出对接现有系统的实例

假设我们有一个学生管理系统&#xff0c;通过prompt提示&#xff0c;格式化输出然后对接现有系统&#xff0c;也是通过react实现&#xff0c;因为这只是一个知识分享&#xff0c;没弄太复杂&#xff08;使用react实现&#xff09;。 学生管理系统 1、设计好prompt getMemory()…

大屏数据看板一般是用什么技术实现的?

我们看到过很多企业都会使用数据看板&#xff0c;那么大屏看板的真正意义是什么呢&#xff1f;难道只是为了好看&#xff1f;答案当然不仅仅是。 大屏看板不仅可以提升公司形象&#xff0c;还可以提升企业的管理层次。对于客户&#xff0c;体现公司实力和品牌形象&#xff0c;…

Linux shell编程学习笔记66:ping命令 超详细的选项说明

0 前言 网络信息是电脑网络信息安全检查中的一块重要内容&#xff0c;Linux和基于Linux的操作系统&#xff0c;提供了很多的网络命令&#xff0c;今天我们研究最常用的ping命令。 1 ping命令 的功能、格式和选项说明 1.1 ping命令 的功能 简单来说&#xff0c; ping 命令 会…

编写SpringBoot的自定义starter包

starter项目 先来看一下Starter的官方解释&#xff1a; Spring Boot Starter 是一种方便的依赖管理方式&#xff0c;它封装了特定功能或技术栈的所有必要依赖项和配置&#xff0c;使得开发者可以快速地将这些功能集成到Spring Boot项目中。Spring Boot官方提供了一系列的Star…

首次 Cloudberry Database 社区聚会 · 北京站,8月3日,诚邀

近期 Greenplum 源码归档及走向闭源在圈内讨论火热&#xff0c;原有开源用户面临断档风险。作为 Greenplum 衍生版和开源替代&#xff0c;Cloudberry Database 由原厂核心开发者打造&#xff0c;与其保持兼容&#xff0c;并且具备更新内核和更丰富功能。Cloudberry Database 逐…

代理协议解析:如何根据需求选择HTTP、HTTPS或SOCKS5?

代理IP协议是一种网络代理技术&#xff0c;可以实现隐藏客户端IP地址、加速网站访问、过滤网络内容、访问内网资源等功能。常用的IP代理协议主要有Socks5代理、HTTP代理、HTTPS代理这三种。代理IP协议主要用于分组交换计算机通信网络的互联系统中使用&#xff0c;只负责数据的路…

【MATLAB实战】基于UNet的肺结节的检测

数据&#xff1a; 训练过程图 算法简介&#xff1a; UNet网络是分割任务中的一个经典模型,因其整体形状与"U"相似而得名,"U"形结构有助于捕获多尺度信息,并促进了特征的精确重建&#xff0c;该网络整体由编码器,解码器以及跳跃连接三部分组成。 编码器由…

UE4/5 对话系统

参考教程&#xff1a;UE4甜筒教艺术生学蓝图#21.UE4对话系统(1)--唠嗑案例展示_哔哩哔哩_bilibili 说来惭愧两年前看的教程&#xff0c;现在才记录一下&#xff0c;很好的教程推荐大家观看 1.首先创建两个枚举&#xff0c;内容如下 2.创建三个结构体&#xff0c;内容如下 3.再…

SSRF:服务端请求伪造

SSRF漏洞原理 SSRF漏洞通常是因为服务端应用程序提供了从其他服务器获取数据的功能&#xff0c;但未对目标地址或协议进行适当的过滤和限制。攻击者可以通过这个漏洞发送构造好的恶意请求&#xff0c;让服务器以自己的身份去访问其他资源&#xff0c;与文件包含漏洞有些许相似…

遍历dom元素下面的子元素的方法,vue中原始标签的ref得到是该元素的dom及下面包含的子dom,与组件ref是引用不同

研究到这个的目的来源是 想用div 遍历方式 替代之前的table tr td 那种框选功能&#xff0c;觉得div灵活&#xff0c;可以随便在外面套层&#xff0c;td与tr之间就不能加div加了布局就乱&#xff0c;然后使用之前的原理&#xff08; const cellList tableIdR.value.querySelec…

Caché 数据库摘要与手册索引

因为设置了 VIP 可见,对于无法直接阅读该篇博客的,建议直接阅读官方博客,链接如下: Cach & Ensemble 2018.1.4 – 2018.1.9 | Documentation Home Page (intersystems.com)https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls 目录 一、简介 0、…

【Socket 编程】应用层自定义协议与序列化

文章目录 再谈协议序列化和反序列化理解 read、write、recv、send 和 tcp 为什么支持全双工自定义协议网络计算器序列化和反序列化 再谈协议 协议就是约定&#xff0c;协议的内容就是约定好的某种结构化数据。比如&#xff0c;我们要实现一个网络版的计算器&#xff0c;客户端…

掌握互联网路由选择协议:从基础入门到实战

文章目录 路由选择协议的基本概念路由选择算法的分类分层次的路由选择协议路由信息协议&#xff08;RIP&#xff09;内部网关协议&#xff1a;OSPF外部网关协议&#xff1a;BGP互联网中的实际应用总结 互联网的路由选择协议是网络通信的核心&#xff0c;它决定了数据包如何在网…

Artix7系列FPGA实现SDI视频编解码+图像缩放+多路视频拼接,基于GTP高速接口,提供4套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的FPGA图像缩放方案本博已有的已有的FPGA视频拼接叠加融合方案本方案的无缩放应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用 3、详细设计方案设计原理框图S…

nodejs编译报错 集合

目录 一、使用命令编译typescript时报错&#xff0c;报错文件tsconfig.json 二、npm start运行后报错&#xff0c;could not find module 一、使用命令编译typescript时报错&#xff0c;报错文件tsconfig.json npx tsc 报错&#xff1a; Specified include paths were [&…

Layer2区块链扩容方案(1)——总述

写在前面 这篇文章作为一个简单介绍&#xff0c;很多技术只是大致提及或者引用&#xff0c;之后会在详细学习后逐项解释。 补充知识 在了解扩容方案之前&#xff0c;我们最好了解一些相关的知识概念 EVM “EVM” 是“Ethereum Virtual Machine”&#xff08;以太坊虚拟机&…

SSRF学习笔记

1.NAT学习 Nat&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;是 一种网络通信技术主要用于将私有网络中的内部IP地址转换成公共网络中的公共IP地址&#xff0c;以实现局域网内部设备访问互联网的功能。具体来说&#xff0c;Nat有以下几个主要…

【Emacs有什么优点,用Emacs写程序真的比IDE更方便吗?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

分析性能提升40%,阿里云Hologres流量场景最佳实践

在互联网和移动分析时代&#xff0c;流量数据成为了企业洞察用户行为、优化产品决策和提升运营效率的关键资源。流量数据主要来源于用户在使用APP、小程序或访问网站等媒介平台时产生的各种操作行为&#xff0c;如点击、浏览、注册、下单等。这些行为数据通过数据埋点技术被采集…

Python爬虫技术 第10节 requests库

requests 是 Python 中非常流行的 HTTP 库&#xff0c;它使得发送 HTTP/1.1 请求变得简单直观。下面我会通过几个实际案例来详细介绍如何使用 requests 库。 1. 发送 GET 请求 最简单的请求类型就是 GET 请求&#xff0c;通常用于获取网页或其他资源。 import requests# 发送…