C++模板使用

news2024/11/23 3:23:19

 感谢你的阅读!!!


目录

 感谢你的阅读!!!

举个例子:

template

有什么意义为什么要用模板

与typedef的区别

使用方法

模板:隐式实例化与显示实例化

和非模板函数以及多个模板类函数重载情况

类模板声明与定义


举个例子:

在古代模板就一块板子,在一本书的复制,如果靠手写不止到猴年马月才可以推广,但是在伙子印刷术的出现,大大的加快了书籍的推广。。。。

template <typename NAME>

 使用方法 关键字template <typename Name>

template <typename Ty>
Ty add(const Ty&a,const Ty&b)
{
    return a+b;
}


int main()
{
    cout<<add(1,2)<<endl;
    return 0;
}

在主函数中打印表达式中的add函数会根据传入的形参类型确定类型,然后再参数出自动推导类型。

那有个问题来了,模板是函数吗?

其实很好回答的,跨海大桥图纸是跨海大桥吗?不是的

让我们看下面这段代码

 我们将i1,i2、d1,d2 、ch1,ch2,分别传入swap函数进行交换,运行代码

发现确实交换了,那么可以说我们的模板其实是一个函数咯?其实模板只是模板而这里是使用了根据模板造的3个Swap函数

 根据传入的参数类型编译器推演类型,确定生成哪一类临时函数进行完成任务。

所以这里的函数其实是3个不同类型的Swap()。

有什么意义为什么要用模板

为了更快,更方便的使用代码完成任务,避免一直写一些数据类不同而任务相同的函数。

将程序员从任务相同数据类型不同的函数中解放出来。

与typedef的区别

如果是typedef为类型其别名的话,它其实也是为了便利函数,但是在上述的代码中它是十分不利的

 一个函数只能完成一个类型数据的交换,如果需要同时交换数据那只能写多个Swap函数进行函数重载了,但是加上自定义类型的话,那么要写的Swap重载函数需要太多太多的,但是使用模板进行书写,就只关心传入的数据了

使用方法

template关键字+<class/typename name>注意这里的class不能使用struct代替!!!!!

函数/类。

模板:隐式实例化与显示实例化

隐式实例化:

template <typename Ty>
Ty Add(const Ty& a, const Ty& b)
{
	return a + b;
}
int main()
{
	cout << Add(1, 2) << endl;
	return 0;
}

没有指定Add函数参数类型,编译器自动识别实参类型进行推演后实例化Swap函数,进行完成任务。

Ty Add(const Ty& a, const Ty& b)
{
	return a + b;
}
//...1和2传入,推演类型为int,模板实例化
int Add(const int& a, const int& b)
{
	return a + b;
}

显示实例化

有一种情况,如果Add的两个实参类型不一样

Ty Add(const Ty& a, const Ty& b)
{
	return a + b;
}
int main()
{
	cout << Add(1, 2.2) << endl;//int,double
	return 0;
}

这个时候编译器将不知道应该为哪一种函数类型

 解决方法一:传入数据强制类型转换

Add(1,(int)1.1);
//或者
Add((double)1,1.1);

虽然可以完成任务,但是加大了程序员的负担,不推荐

解决方法二:设置两个模板。

template <typename Ty,typename Tx>
Ty Add(const Ty& a, const Tx& b)
{
	return a + b;
}
int main()
{
	cout << Add(1, 2.2) << endl;

这样虽然解决了传入不同参数的方法,但是在返回值的时候是根据a的数据类型为返回值类型的,加大了我们程序员的复杂性。一般推荐

解决方法三:使用显示模板实例化

显示的实例化,不在根据实参类型实例化我们的函数,根据我们自己的要求实例化函数

template <typename Ty,typename Tx>
Ty Add(const Ty& a, const Tx& b)
{
	return a + b;
}
int main()
{
	cout << Add<int,int>(1, 2.2) << endl;

无论Add类型如何,我们的实例化的函数形参类型都是int,int类型。

这样我们可以更加随心所欲的使用模板实例化函数了。

和非模板函数以及多个模板类函数重载情况

与非模板函数:

当模板函数与我们的非模板函数同名是,会根据类型函数调用函数。

 运行代码:

发现调用

为什么会发生这样的事情呢?因为推演有时间的

调用Add函数的时候会先看代码中是否有参数类型匹配的函数定义,如果有就会调用匹配函数,如果没有才会根据模板实例化相应函数,然后调用实例化函数。

与模板函数

因为推演会有时间上的损耗,所以两个模板不同名字相同的函数会有区别

也是根据实参类型,使用不同的模板,这里我们不深究,这样的情况我们在日常工作中很少遇见,找到就好了。

类模板必须显示实例化

为什么类模板必须显示实例化?

为了类中出现任何成员函数中可以使用模板,必须显示实例化模板:必须提供模板参数,以便编译器可以生成实际的类(或函数,来自函数模板)。

如st1我们隐式实例化,我们就无法知道我们的TData的替换是说明类型数据了,这样在类成员函数中以及成员变量我们就不知道该类型是什么类型了,所以我们的必须显示实例化类实例化对象,如st2,我们就实例化了保存char类型一个类=>栈。否则,我们将不知道该栈存储的是什么数据了。

所以,如果说类是对象的图纸,那么类模板就是类的图纸。对类也要实例化产生实例的类。


这里有一个注意的地方!!!

类模板声明与定义

类模板声明与定义不要分离(声明在.h,定义在.cpp )

也就是说,一个类模板实现,函数的声明与定义不能分别在不同的文件中。

但是同一个文件可以实现类模板成员函数声明定义分离。但是我们在类域外定义的时候也要进行模板的操作

 感谢你的阅读!!!

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

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

相关文章

SAP ABAP MARA-MSBOOKPARTNO 制造商登记部分编号

BAPI_MATERIAL_SAVEDATA CLIENTDATA结构无此字段。 DATA:LS_TE_MARA TYPE BAPI_TE_MARA. DATA:LS_TE_MARAX TYPE BAPI_TE_MARAX. DATA:LT_BAPIPAREX TYPE TABLE OF BAPIPAREX. DATA:LS_BAPIPAREX TYPE BAPIPAREX. …

Spring Bean作用域与生命周期

目录 Bean的作用域&#xff1a; Bean有六大行为模式 1、singleton:单例模式(默认) 2、prototype: 原型模式(多例模式) 3、request: 请求作用域(Spring MVC) 4、session: 会话作用域(Spring MVC) 5、application: 全局作用域(Spring MVC) 6、websocket: HTTP WebSocket …

M1 Mac安装Zookeeper

下载Zookeeper 由于通过homebrew下载的zookeeper没有conf文件夹&#xff0c;因此我们在官网下载 zookeeper-3.7.1 然后下载上面这个 将解压后的文件转移到 /usr/local 更改配置文件 1、配置文件位置位于解压文件夹下conf文件夹内部&#xff0c;默认名字为zoo_sample.cfg&…

Unity设计模式—命令队列

Unity设计模式—命令队列 概要 本篇将介绍命令队列并用命令队列模式实现一个Unity里的WindowManager。 命令队列是一个按照FIFO顺序存储一系列通知或请求的队列。发出通知时系统会将请求置入队列并立即返回&#xff0c;请求处理器随后从命令队列中获取并处理这些请求。请求可由…

集合专题·拔高·壹

文章目录 1 Collection单列集合、Map双列集合1.1 Collection单列集合1.1.1 Collection单列集合及其实现类1.1.1.1 list集合与Array数组1.1.1.1.1 ArrayList1.1.1.1.2 LinekdList1.1.1.1.2 Vector1.1.1.1.2.1 ArrayList、Vector &#xff08;线程安全&#xff09;的区别是什么1.…

【数据结构与算法】前缀和+哈希表算法

文章目录 一、引入二、前缀和与哈希表的结合三、例题3.1 和为 K 的子数组3.2 统计「优美子数组」3.3 路径总和III 四、总结 一、引入 关于前缀和和哈希这两个概念大家都不陌生&#xff0c;在之前的文章中也有过介绍&#xff1a;前缀和与差分算法详解 而哈希表最经典的一题莫过…

Kerberos设计和落地长常识

Kerberos 处理三类安全对象 票证 kerberos票证授予服务给每个客户发一张标记&#xff0c;该标记发送给一个特殊的服务器&#xff0c;证实kerberos最近已经认证了发送者&#xff0c;票证包括过期时间和新生成的会话密钥供客户和服务器使用。 认证 由客户构造的一个标记&#xff…

LVS负载均衡之NAT模式

实验准备四台虚拟机 192.168.255.128 做负载均衡器&#xff08;两张网卡&#xff0c;且都需要NAT模式&#xff09; 192.168.255.130 Nginx节点服务器1 192.168.255.131 Nginx节点服务器2 192.168.255.132 nfs共享服务器 现将四台虚拟机的防火墙关闭 一、nfs服务器配置 1…

使用Visual Studio 创建Windows服务,并安装部署

创建服务的工程 Program.cs是入口类&#xff0c;Service1.cs是写服务功能的组件&#xff0c;类似于winform项目中的Form1.cs。 打开Service1.cs&#xff0c;&#xff08;右键单击Service1.cs&#xff0c;选择查看源码&#xff09; OnStart&#xff1a;服务启动时&#xff0c;执…

产品说明书应该如何制作?

在当今互联网时代&#xff0c;产品说明书无疑是一种展示产品特性、引导用户使用和解决用户问题的重要方式。一份精心制作的产品说明书&#xff0c;能够让用户更快地了解和掌握产品的使用方法&#xff0c;让用户充分享受产品带来的便利。不过要做出一份高质量的产品说明书&#…

算法:在指定范围内生成随机不重复的位置

问题&#xff1a; 在游戏中&#xff0c;我们经常会遇到以下问题&#xff1a;在指定的范围内生成随机不重复的位置。 比如某次“神官赐福”活动中&#xff0c;需要在城门口生成n个不重复的宝箱。 针对这种问题&#xff0c;我们可以先将范围按照宝箱&#xff08;基本单元格&#…

塔望食研院丨百年益生菌,千亿市场正蓝海!

2022年12月塔望咨询开设塔望食品大健康消费研究院&#xff08;简称塔望食研院&#xff09;栏目&#xff0c;塔望食研院以“为食品行业品牌高质量发展赋能”为理念&#xff0c;将不定期发布食品大健康行业研究、消费研究报告。塔望食研院致力于结合外部数据、消费调研数据、企业…

目标追踪篇---yolov8_tracking复现

文章目录 目标追踪篇---yolov8_tracking复现1、下载源代码2、下载权重3、运行代码3.1、运行以下命令&#xff1a;3.2、结果如下3.3、视频结果 目标追踪篇—yolov8_tracking复现 本人的另一篇博客&#xff0c;本博客主要是源代码更新产生的新博客&#xff0c;比较过后两者还是有…

计算多列迭代次数的一种平均列近似方法

比较多列训练集的迭代次数&#xff0c;把多列训练集用单列近似&#xff0c;再通过计算单列的斥力比较迭代次数的大小顺序。 ( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有3个节点&#xff0c;AB各由5张二值化的图片组成&#xff0c;让A中有5个1&#xff0c;B中全是0&a…

魔兽服务端 MANGOS 数据库结构表中文解释

魔兽服务端 MANGOS 数据库结构表中文解释 MANGOS 数据库结构表 achievement_reward 巫妖王的奖励成就 areatrigger_involvedrelation 传送(区域触发)_包含的任务关系 areatrigger_scripts 区域触发脚本 areatrigger_tavern 进传送门…

优维低代码:个性化桌面配置

导语 优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。…

分布式系统概念和设计——安全模型中的设计和思考落地

分布式系统概念和设计 安全性攻击的形式——窃听&#xff0c;伪装&#xff0c;篡改&#xff0c;拒绝服务等。 可靠的分布式系统设计必须解决暴露的服务接口和不安全网络的问题&#xff0c;而攻击者可能了解其中所使用的算法并部署计算资源。 密码学为消息的私密性和完整性以及认…

Windows环境下的静态库和动态库的使用详解

文章目录 简介lib库的详细说明第一种是静态lib库第二种是lib导入库两种库的说明两种lib库的相同点和不同点 在visual studio下静态lib库的导出和使用导出过程演示使用过程演示使用方式一使用方式二使用方式三使用方式四使用方式五使用方式六使用方式七其他组合方式 在visual st…

2022-04-24:用go语言重写ffmpeg的muxing.c示例。

2022-04-24&#xff1a;用go语言重写ffmpeg的muxing.c示例。 答案2022-04-24&#xff1a; 本程序的大体过程如下&#xff1a; 打开输出文件并写入头部信息。 添加音频和视频流&#xff0c;并为每个流创建 AVCodecContext 对象&#xff0c;根据输入格式设置编码器参数&#x…

Volatile与ThreadLocal

一&#xff1a;Volatile 线程安全三方面 1 可见性&#xff1a;一个线程对共享变量修改&#xff0c;另一个线程可以看到最新结果 2 有序性&#xff1a; 一个线程内&#xff0c;代码编写按顺序执行 3 原子性&#xff1a; 一个线程内多行代码以一个整体运行&#xff0c;期间不能…