模板(c++)part1

目录

1.模板

1.1模板基本使用

1.2.模板实例化

1.3函数模板的匹配规则

2.类模板


!!!!!!!目前更新到这,后面再更新模板的其他内容,本文章只是第一部分,第二部分等后面我再写!!!!

1模板

1.1模板基本使用

template<typename T>
void swap(T& left, T& right)
{T temp = left;left = right;right = temp;
}int main()
{int a = 2, b = 3;double a1 = 2.1, b1 = 3.1;swap(a, b);swap(a1, b1);return 0;
}
auto不能用在函数参数上,而void*也难以解决自定义类型,所以c++这里又出现了
个模板,用来解决类似的问题。像上面,我们将交换函数用这种方式写,就可以让内置和自定义都能
放进去。
template是关键字,typename可以用class替代,但不能用struct替代
template<typename T1,typename T2,typename T3,typename T4>

注意,T1,T2可以是一样的类型,比如函数参数是T1& x,T2& y 。我们传可以都穿int,最后T1和T2就都会是int类型。

 像上面的例子,每次调用不同类型,本质上是调用了不同的函数,编译器自身麻烦点,每次都生成个函数来用,但我们只管传就行。

1.2.模板实例化

template<typename T>
T swap(const T& left, const T& right)
{return left+right;
}int main()
{int a = 2, b = 3;double a1 = 2.1, b1 = 3.1;swap(a, a1);swap(b, b1);return 0;
}
这个情况,模板参数只有一个T,我们传两个不同类型的参数给函数,
编译器无法确认T到底是什么类型,这样就会报错。
我们可以通过给更多的模板参数,函数的参数也用不同的模板参数还有就是在传参的时候做改变,
T add( T& left,  T& right)
{return left + right;
}int main()
{int a = 2, b = 3;double a1 = 2.1, b1 = 3.1;int g=add(a, b);g = add(a, (int)a1);cout << g << endl;return 0;
}
这时候可以用两种,一个是强转,像上面的一样。一种就是add<int>(a,a1);
也就是显示实例化
但这样还是会报错,为什么呢,因为函数参数我们用了引用,但这样的话,这两种方法本质上都是让传递的参数适应函数模板,并且这两种方法都是产生了,a1都是进行了类型转换,转换后产生的临时变量再传参,但是引用一般不支持临时变量的引用,所以上面的方法必须还得对函数的参数进行改变,如下:
T add( const T& left,  const T& right)//const加引用,才支持临时变量
{return left + right;
}int main()
{int a = 2, b = 3;double a1 = 2.1, b1 = 3.1;int g=add(a, b);g = add(a, (int)a1);cout << g << endl;return 0;
}

而显示实例化,一般是针对模板函数的参数里面没有模板参数,用上面的例子的话,就是add函数的参数里面没有T类型,而是用在了函数体里面。

1.3函数模板的匹配规则

int Add(double left, double right)
{return left + right;
}
template<class T>
T Add(T left, T right)
{return left + right;
}
void Test()
{Add(1, 2); // 与非模板函数匹配,编译器不需要特化Add<double>(1, 2); // 调用编译器特化的Add版本
}
非模板函数与同名模板函数可以同时存在。Add(1, 2)这句调用第一个函数,因为对于编译器来说会省下一个实例化模板的操作
但如果 Add<double>(1, 2);的话,就会强制让编译器实例化模板函数。

int Add(int left, int right)
{return left + right;
}
template<class T1, class T2>
T1 Add(T1 left, T2 right)
{return left + right;
}
int main()
{Add(1,2);这里会直接调用非模板函数Add,因为类型完全匹配Add(1,2.0);//这里,如果没有模板函数,那么也是可以传参的,只是会进行隐式类型转换。//但这里有函数模板,那么编译器就会选择实例化函数模板,产生一个更加匹配的函数来接收参数return 0;
}
注意!!
函数模板不支持自动类型转换,普通函数支持

2.类模板

 关于类模板,先看下面的代码

class aaa
{
public:aaa(){b = 10;}
private:int  b;
};int main()
{aaa* a = new aaa;return 0;
}
这样这个类里面b是固定的int类型,我们如果想让b存别的类型,就得cv一下,再写个别的类型的
但通过类模板,比如
template<typename T>
class aaa
{
public:aaa(T& b){_b = b;}
private:T  _b;
};int main()
{aaa<int> a;return 0;
}
通过实例化,我们传什么类型,就生成什么类型的类。
实例化之后的才是一个类,上面那个是类模板

如果类模板里声明一个函数,类模板外定义函数,那么在类模板外定义的时候,要先加个

template<typename T>(具体不一定这样,但是重点是加模板参数列表)在函数定义的上面

template<typename T>
class aaa
{
public:aaa(T& b);
private:T  _b;
};template <class T>
aaa<T>::aaa(T& b)
{//.....
}

声明和定义必须在同个文件。

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

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

相关文章

前端实现token的无感刷新--VUE

token刷新的方案 方案一&#xff1a;后端返回过期时间&#xff0c;前端判断token过期时间&#xff0c;去调用刷新token的接口 缺点&#xff1a;需要后端提供一个token过期时间的字段&#xff1b;使用本地时间判断&#xff0c;若本地时间被修改&#xff0c;本地时间比服务…

【解决】Unity 工程无法正常打开而崩溃问题

开发平台&#xff1a;Unity 2022.3.17f1c1 一、问题描述 访问 Unity 工程等待 Open Projet&#xff08;busy for 时间&#xff09;&#xff0c;出现崩溃、闪退等情况&#xff0c;导致无法正常进入Unity编辑页面。 二、问题分析 笔者在 URP 渲染管线下处理 Obi Fluid 流体插件 D…

Docker本地部署Firefox浏览器并结合内网穿透公网访问

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器&#xff0c;由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

尝试搭建域

使用window 7 作为dmz 主机 server_2008 作为 预控 前提两台主机都在同一个LAN 下&#xff08;设置一个LAN 区域&#xff09;&#xff0c;同样防火墙关闭状态 首先搞定server 2008 中的域 1. 在计算机属性中选择更改设置中将主机名修改一下&#xff1a; 2. 在server 2008 中…

echarts 柱状图数据过多时自动滚动

当我们柱状图中X轴数据太多的时候&#xff0c;会自动把柱形的宽度挤的很细&#xff0c;带来的交互非常不好&#xff0c;我们可以用dataZoom属性来解决 简易的版本&#xff0c;横向滚动。 option.dataZoom [{type: "slider",show: true,startValue: 0, //数据窗口范…

【刷题】牛客网 NC132 环形链表的约瑟夫问题

NC132 环形链表的约瑟夫问题 题目描述思路一&#xff08;链表直通版&#xff09;思路二&#xff08;数组巧解版&#xff09;思路三&#xff08;变态秒杀版&#xff09;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读下一篇文章见&#xff01;&#xff01;&#xff…

Oracle 的闪回技术是什么

什么是闪回 Oracle 数据库闪回技术是一组独特而丰富的数据恢复解决方案&#xff0c;能够有选择性地高效撤销一个错误的影响&#xff0c;从人为错误中恢复。闪回是一种数据恢复技术&#xff0c;它使得数据库可以回到过去的某个状态&#xff0c;可以满足用户的逻辑错误的快速恢复…

SpringCloudAlibaba组件总结笔记(如Nacos、SpringCloudGateway、OpenFeign,Ribbon,RabbitMQ)

这目录 1.Ribbon负载均衡1负载均衡原理2.负载均衡策略1.负载均衡策略2.自定义负载均衡策略 3.饥饿加载 2.Nacos注册中心与Eureka的区别3.Nacos配置中心1.从微服务拉取配置2.配置热更新1.2.1.方式一1.2.2.方式二 3.配置共享1.配置共享的优先级 4.Feign1.Feign使用优化2.配置连接…

使用Promethues+Grafana监控Elasticsearch

PromethuesGrafana监控Elasticsearch 监控选用说明指标上报流程说明实现监控的步骤搭建elasticsearch-exporter服务搭建promethues和grafana服务 监控选用说明 虽然用Kibana来监控ES&#xff0c;能展示一些关键指标&#xff0c;但ES本身收集的指标并不全面&#xff0c;还需要在…

torchvision.models._utils.IntermediateLayerGetter()使用

torchvision.models._utils.IntermediateLayerGetter&#xff08;&#xff09;使用 源码如下&#xff1a; from collections import OrderedDictimport torch from torch import nnclass IntermediateLayerGetter(nn.ModuleDict):"""Module wrapper that ret…

Python采集学习笔记-读取excel数据

表格格式 方法一:使用xlrd import xlrd 1.读取Excel文件 workbook xlrd.open_workbook(plc.xlsx) 2.读取第一个表 sheet workbook.sheet_by_index(0) 3.获取表格总行数 total_rows sheet.nrows 4.创建列表,存储表格一行中每一列信息 plc_info [] for row in range(1…

C语言常见面试题:什么是队列,队列的作用是什么?

队列是一种特殊的线性表&#xff0c;它只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;进行插入操作。这种操作受限制的线性表具有先进先出&#xff08;FIFO—first in first out&#xff09;的特性。进行插入…

【JAVA】Long类型返回到前端,精度丢失

一. 问题阐述 20位long类型的数字&#xff0c;从后端接口返回到前端后【四舍五入】 MYSQL端 &#xff08;1&#xff09;bigint (20) &#xff08;2&#xff09;具体某一条数据 JAVA端 &#xff08;1&#xff09;实体类 &#xff08;2&#xff09;服务类 &#xff08;3&…

docker可视化操作

docker可视化操作&#xff0c;ui界面操作 1.检查docker服务状态 docker status2.安装服务 部署 Portainer 1.从镜像仓库中拉取 Portainer&#xff1a;docker pull portainer/portainer2.创建数据卷&#xff1a; docker volume create portainer_db 3.启动 Portainer命令&…

Unity数据解析(Json、XML、CSV、二进制)

注释 常见的数据解析&#xff08;Json、XML、CSV、二进制&#xff09; using System; using System.IO; using System.Xml.Serialization; using Newtonsoft.Json; using System.Runtime.InteropServices; using System.Text; using System.Reflection; using System.Collect…

猜数字游戏(扩展)

游戏要求&#xff1a; 1. 电脑⾃动⽣成1~100的随机数 2. 玩家猜数字&#xff0c;猜数字的过程中&#xff0c;根据猜测数据的⼤⼩给出⼤了或⼩了的反馈&#xff0c;直到猜对&#xff0c;游戏结束 1. 随机数⽣成 1.1 rand C语⾔提供了⼀个函数叫 rand&#xff0c;这函数是可…

86.网游逆向分析与插件开发-物品使用-物品丢弃的逆向分析与C++代码的封装

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;物品使用的逆向分析与C代码的封装-CSDN博客 码云地址&#xff08;ui显示角色数据 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;7563f86877c…

NFTScan 与 Merlin Protocol 共同推出 BRC20 Indexer Oracle,于今日正式上线!

近日&#xff0c;NFT 数据基础设施 NFTScan 与 Merlin Protocol 进行战略合作&#xff0c;联合推出了比特币网络原生资产 Indexer Oracle 服务&#xff0c;现在该服务已在 NFTScan 开发者平台上线&#xff0c;任何开发者都可以注册使用&#xff01; Merlin Protocol 是一个专用…

linux 磁盘标签类型MBR转换为GPT

[rootlocalhost /]# fdisk -l 磁盘 /dev/sda&#xff1a;299.4 GB, 299439751168 字节&#xff0c;584843264 个扇区 Units 扇区 of 1 * 512 512 bytes 扇区大小(逻辑/物理)&#xff1a;512 字节 / 512 字节 I/O 大小(最小/最佳)&#xff1a;512 字节 / 512 字节 磁盘标签类…

解读 HTTP 和 HTTPS:有何异同?

超文本传输安全协议&#xff08;HTTPS&#xff09;是建立在超文本传输协议&#xff08;HTTP&#xff09;之上的一种安全网络传输协议。在计算机网络上传输时&#xff0c;HTTPS 通过传输层安全性&#xff08;TLS&#xff09;或它的前身安全套接字层&#xff08;SSL&#xff09;为…