C++模板使用

news/2024/4/28 13:05:48/文章来源:https://blog.csdn.net/2201_75352618/article/details/130336754

 感谢你的阅读!!!


目录

 感谢你的阅读!!!

举个例子:

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,doublereturn 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.luyixian.cn/news_show_102864.aspx

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

相关文章

气传导耳机和骨传导耳机的区别是啥?气传导耳机有哪些优缺点?

本文主要讲解一下气传导耳机和骨传导耳机的区别、气传导耳机的优缺点&#xff0c;并推荐一些目前主流的气传导耳机款式&#xff0c;大家可以根据自身需求&#xff0c;选择自己感兴趣的部分观看。 气传导耳机和骨传导耳机不同点&#xff1a; 气传导耳机和骨传导耳机最大且最根…

什么是 MVVM?MVVM和 MVC 有什么区别?什么又是 MVP ?

目录标题 一、什么是MVVM&#xff1f;二、MVC是什么&#xff1f;三、MVVM和MVC的区别&#xff1f;四、什么是MVP&#xff1f; 一、什么是MVVM&#xff1f; MVVM是 Model-View-ViewModel的缩写&#xff0c;即模型-视图-视图模型。MVVM 是一种设计思想。 模型&#xff08;Model…

windows安装sqli-labs靶场,两种方式

1、安装phpstudy 官网打不开了&#xff0c;下载地址在这儿https://download.csdn.net/download/weixin_59679023/87711536 双击安装 点自定义安装&#xff0c;选择安装目录&#xff0c;注意目录不要有空格和中文 安装完成启动红框内的两个服务 2、安装sqli靶场 这个包支持ph…

信息收集(三)端口和目录信息收集

信息收集&#xff08;一&#xff09;域名信息收集 信息收集&#xff08;二&#xff09;IP信息收集 端口是什么 "端口"是英文port的意译&#xff0c;可以认为是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口&#xff0c;其中虚拟端口指计算机内部或交换机…

关于package.json中版本锁定的方法和问题解决

前置知识&#xff1a;先了解一下package.json和package-lock.json的关系和区别&#xff0c;请看这篇文章 然后我们来说一下改怎么锁定版本&#xff1f; 首先肯定是要把package.json中的 ^ 这个符号去掉&#xff0c;但是如果你只去掉package.json中的 ^那就太天真了&#xff0…

必应,百度,神马头条,搜狗专用站长seo推送工具大全

软件介绍&#xff1a; 百度开始打击滥用api问题&#xff0c;针对这个问题已经开发了拟人推送系列功能&#xff0c;放心使用。 五合一高效推送软件&#xff0c;目前支持百度&#xff0c;神马&#xff0c;必应&#xff0c;搜狗&#xff0c;头条&#xff0c;谷歌六大搜索引擎同步…

优秀简历的HR视角:怎样打造一份称心如意的简历?

简历的排版应该简洁工整&#xff0c;注重细节。需要注意对齐和标点符号的使用&#xff0c;因为在排版上的细节需要下很大功夫。除此之外&#xff0c;下面重点讲述几点简历内容需要注意的地方。 要点1&#xff1a;不相关的不要写。 尤其是与应聘岗位毫不相关的实习经历&#x…

服务提供者 Eureka + 服务消费者(Rest + Ribbon)实战

1、Ribbon背景介绍 Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法&#xff0c;将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时&#xff0c;重试等。简单来说&#xff0c;就是在配置文件中列出Load B…

【手把手做ROS2机器人系统开发二】熟悉ROS2基本命令

【手把手做ROS2机器人系统开发二】熟悉ROS2基本命令 一、上讲回顾 在上一讲开发环境搭建中&#xff0c;我们讲解了如何搭建Ubuntu系统环境和ROS2开发运行环境。 1.Ubuntu系统安装 2.ROS2系统环境安装 二、ROS2核心命令讲解 1、daemon-各种守护进程相关的子命令 查看帮助&am…

【计算机网络】网络命令的使用

文章目录 一、实验目的二、实验工具三、实验要求四、实验过程01 ping 命令的使用应用1&#xff1a;验证本地计算机上是否正确安装了 TCP/IP 协议应用2&#xff1a;测试某个目的主机可达性应用3&#xff1a;键入 ping&#xff0c;查看 ping 的其他参数含义 02 netstat 命令的典型…

可能是最强的Python可视化神器,建议一试

数据分析离不开数据可视化&#xff0c;我们最常用的就是Pandas&#xff0c;Matplotlib&#xff0c;Pyecharts当然还有Tableau&#xff0c;看到一篇文章介绍Plotly制图后我也跃跃欲试&#xff0c;查看了相关资料开始尝试用它制图。 Plotly Plotly是一款用来做数据分析和可视化的…

关于GeoServer发布的wfs服务的精度问题

本周基于arcgis/core组件&#xff0c;利用arcgis api for js 4.22版本加载GeoServer发布的同一数据源的wms和wfs服务&#xff0c;出现了偏移的问题。 分析&#xff1a;同一数据源不同的访问方式&#xff0c;出现了偏移&#xff0c;这是很严重的问题。初步判断为js api加载方式的…

HTB-SecNotes

HTB-SecNotes 信息收集8808端口80端口通过CSRF获取通过二次注入 立足tyler -> administrator 信息收集 8808端口 Windows IIS 10.0 可以从官方文档查看10.0版本可能的操作系统。 80端口 通过CSRF获取 目录扫描发现需要登陆后继续进一步操作啊。 对其进行简单的SQL注入测…

Ubuntu20.04安装CUDA和CUDNN

CUDA是GPU深度学习的运行库&#xff0c;那么cuDNN就是训练加速工具&#xff0c;两者要相互配合使用&#xff0c;所以一般机器学习需要训练引擎(tensorflow-gpu) CUDA cuDNN使用。想不安装cuDNN是不可以的&#xff0c;而且cuDNN版本要和CUDA版本相互搭配。 1、前置工作 查看…

MinIO快速入门

一、MinIO概述 官网地址&#xff1a;http://www.minio.org.cn/ 文档地址&#xff1a;http://docs.minio.org.cn/docs/ MinIO是一款基于Apache License v2.0开源协议的分布式文件系统&#xff08;或者叫对象存储服务&#xff09;&#xff0c;可以做为云存储的解决方案用来保存海…

uniapp + vue3开发中组合式函数必须是一个同步函数

目录 vue3中的组合式函数用法&#xff1a; 官网示例异步组合式函数&#xff1a;同步函数写法 改造成导出async组合式函数时&#xff1a; uniapp无法使用async组合式函数的原因&#xff1a; vue3中的组合式函数使用时&#xff0c;导出的组合式函数必须是一个同步函数。 vue3…

推荐一个开源的区块链开发者工具网站

开源区块链开发者工具箱 https://ChainTool.tech 今天可以正式上线了。ChainTool 使用完全开源的方式编写一些开发者日常经常使用的工具。 关于 ChainToolDAO 大约在两个月前&#xff0c; ChainToolDAO 成立了&#xff0c;成立 ChainToolDAO 的来由是这样的&#xff1a;我是一…

【14】SCI易中期刊推荐——计算机 | 人工智能(中科院2区)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…

QMS-云质说质量 - 10 我和我的客户投诉(2) - 客户逐利 驱除良币

云质QMS原创 转载请注明来源 作者&#xff1a;王洪石 上策伐谋 中策伐交 前面发过一篇关于客户投诉的文章“逢年过节要祈祷”&#xff0c;引起了很多质量人的共鸣&#xff0c;特别是汽车零部件行业曾经和正在负责客诉的质量同行们。 真实的产品质量问题&#xff0c;是否发生只…

【GoodERP专题】第一章 GoodERP应用专题之good_expense 费用报销 的使用

文章目录 一、模块设计二、模块1.主数据2.费用申请单3.借款单【付款】4.费用报销单【挂账/付款】5.出差申请单6.出差借款单【付款】7.差旅费报销单【挂账/付款】 总结 一、模块设计 费用报销模块是基于GoodERP框架设计的&#xff0c;该模块是为了解决企业内外费用相关报销任务处…