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

目录

泛型编程

函数模板

函数模板格式

函数模板的原理

函数模板的实例化

类模板

类模板格式

类模板实例化


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

在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.xdnf.cn/news/1487080.html

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

相关文章

opencv grabCut前景后景分割去除背景

参考&#xff1a; https://zhuanlan.zhihu.com/p/523954762 https://docs.opencv.org/3.4/d8/d83/tutorial_py_grabcut.html 环境本次&#xff1a; python 3.10 提取前景&#xff1a; 1、需要先把前景物体框出来 需要坐标信息&#xff0c;可以用windows自带的画图简单提取像素…

如何合并电脑硬盘分区?轻松合并电脑硬盘分区

在日常使用电脑的过程中&#xff0c;我们有时需要对硬盘进行分区管理。然而&#xff0c;随着时间的推移&#xff0c;我们可能会发现原有的分区设置不再满足需求&#xff0c;这时就需要对分区进行调整&#xff0c;甚至合并分区。那么&#xff0c;我们该如何合并电脑硬盘分区呢&a…

【Vue实战教程】之Vue工程化项目详解

Vue工程化项目 随着多年的发展&#xff0c;前端越来越模块化、组件化、工程化&#xff0c;这是前端发展的大趋势。webpack是目前用于构建前端工程化项目的主流工具之一&#xff0c;也正变得越来越重要。本章节我们来详细讲解一下如何使用webpack搭建Vue工程化项目。 1 使用we…

【数据结构】稀疏数组

问题引导 在编写五子棋程序的时候&#xff0c;有“存盘退出”和“续上盘”的功能。现在我们要把一个棋盘保存起来&#xff0c;容易想到用二维数组的方式把棋盘表示出来&#xff0c;但是由于在数组中很多数值取默认值0&#xff0c;因此记录了很多没有意义的数据。此时我们使用稀…

飞机数据网络--ARINC 664协议

飞机数据网络主要是根据ARINC 664协议规范进行数据的计算&#xff0c;传输转换。然而ARINC 664 英文规范太过复杂&#xff0c;不易理解&#xff0c;即使是专业人员&#xff0c;也需要对其进行抽丝剥茧&#xff0c;结合实际进行理解。本文即从基础角度简单分析一下ARINC 664 应用…

【python学习】思考-如何在PyCharm中编写一个简单的Flask应用示例以及如何用cProfile来对Python代码进行性能分析

引言 Python中有两个流行的Web框架&#xff1a;Django和Flask。Django是一个高级的Python Web框架&#xff0c;它鼓励快速开发和干净、实用的设计&#xff1b;Flask是一个轻量级的Web应用框架&#xff0c;适用于小型到大型应用。以下是使用Flask创建一个简单应用的基本步骤cPro…

【书籍推荐】探索AI大语言模型的基石与边界:《基础与前沿》

本文主要介绍了AI大语言模型的基础与前沿&#xff0c;希望能对学习大模型的同学们有所帮助。 文章目录 1. 前言2. 书籍推荐 2.1 内容简介2.2 本书作者2.3 本书目录2.4 适合读者 1. 前言 全球首个完全自主的 AI 软件工程师上线&#xff0c;它是来自 Cognition 这家初创公司…

上市公司-企业数据要素利用水平(2010-2022年)

企业数据要素利用水平数据&#xff1a;衡量数字化时代企业竞争力的关键指标 在数字化时代&#xff0c;企业对数据的收集、处理、分析和应用能力成为衡量其竞争力和创新能力的重要标准。企业数据要素利用水平的高低直接影响其市场表现和发展潜力。 企业数据要素利用水平的测算…

学习记录——day17 数据结构 队列 链式队列

队列介绍 1、队列也是操作受限的线性表:所有操作只能在端点处进行&#xff0c;其删除和插入必须在不同端进行 2、允许插入操作的一端称为队尾&#xff0c;允许删除操作的一端称为队头 3、特点:先进先出(FIFO) 4、分类&#xff1a; 顺序存储的栈称为顺序栈 链式存储的队列&a…

Spring Boot+WebSocket向前端推送消息

​ 博客主页: 南来_北往 &#x1f525;系列专栏&#xff1a;Spring Boot实战 什么是WebSocket WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;允许服务器主动向客户端推送信息&#xff0c;同时也能从客户端接收信息。 WebSocket协议诞生于2008年&#…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十七章 字符设备和杂项设备总结回顾

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

springboot旅游规划系统-计算机毕业设计源码60967

摘 要 微信小程序的旅游规划系统设计旨在为用户提供个性化的旅游规划服务&#xff0c;结合Spring Boot框架实现系统的高效开发与部署。该系统利用微信小程序平台&#xff0c;包括用户信息管理、目的地选择、行程规划、路线推荐等功能模块&#xff0c;为用户提供便捷、智能的旅…

英迈中国与 Splashtop 正式达成战略合作协议

2024年7月23日&#xff0c;英迈中国与 Splashtop 正式达成战略合作协议&#xff0c;英迈中国正式成为其在中国区的战略合作伙伴。此次合作将结合 Splashtop 先进的远程桌面控制技术和英迈在技术服务与供应链管理领域的专业优势&#xff0c;为中国地区的用户带来更加安全的远程访…

Python:对常见报错导致的崩溃的处理

Python的注释&#xff1a; mac用cmd/即可 # 注释内容 代码正常运行会报以0退出&#xff0c;如果是1&#xff0c;则表示代码崩溃 age int(input(Age: )) print(age) 如果输入非数字&#xff0c;程序会崩溃&#xff0c;也就是破坏了程序&#xff0c;终止运行 解决方案&#xf…

Java开发之Redis

1、非关系型数据库、快、高并发、功能强大 2、为什么快&#xff1f;内存单线程 非阻塞的IO多路复用有效的数据类型/结构 3、应用&#xff1a;支持缓存、支持事务、持久化、发布订阅模型、Lua脚本 4、数据类型&#xff1a; 5 种基础数据类型&#xff1a;String&#xff08;字…

html 解决tooltip宽度显示和文本任意位置换行文本显示问题

.el-tooltip__popper {max-width: 480px;white-space: break-spaces; /* 尝试不同的white-space属性值 */word-break:break-all; }

前端文件下载word乱码问题

记录一次word下载乱码问题&#xff1a; 用的请求是axios库&#xff0c;然后用Blob去接收二进制文件 思路&#xff1a;现在的解决办法有以下几种&#xff0c;看看是对应哪种&#xff0c;可以尝试解决 1.将响应类型设为blob&#xff0c;这也是最重要的&#xff0c;如果没有解决…

C#开源、简单易用的Dapper扩展类库 - Dommel

项目特性 Dommel 使用 IDbConnection 接口上的扩展方法为 CRUD 操作提供了便捷的 API。 Dommel 能够根据你的 POCO 实体自动生成相应的 SQL 查询语句。这大大减少了手动编写 SQL 代码的工作量&#xff0c;并提高了代码的可读性和可维护性。 Dommel 支持 LINQ 表达式&#xff…

【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件

目录 ​编辑 前言 系统调用 open 参数flags 参数mode write 追加方式 read close 文件描述符 打开多个文件并观察其文件描述符 C语言文件操作 理解一切皆文件 理解open操作 前言 各类语言的文件操作其实是对系统调用的封装 我们经常说&#xff0c;创建一个文件&a…

【Linux】:自定义shell(简易版)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来一期自定义shell&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结构专栏…