Cpp6 — 模板

news2024/11/14 4:11:49

模板:这里有一个概念:泛型编程---针对广泛的类型去写代码编程。之前都是针对具体的类型进行编程。

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

函数模板

当我们想要使用一个swap可以用作多种类型时,可以使用模板。这样我们就可以不使用重载,不用多写一个函数。

template<>//模板参数(模板类型)--类似函数参数(参数对象)

template<typename T, class V>//typename/class是关键字,T是类型名,可以随便取,其代表一个模板类型(虚拟类型),即可以是任意类型。

模板不支持分离编译,也就是声明在.h,定义在.cpp,这样是不支持的。

template<class T>
void swap(T& x1,T& x2)
{
    T tmp = x1;
    x1 = x2;
    x2 = tmp;
}

int main()
{
    int a = 1, b = 2;
    swap(a,b);//可以
    double c = 1.1, d = 2.2;
    //编译器会通过实参推形参的类型T分别为int和double,这种方式是隐式实例化
    swap(c,d);//可以
    swap(a,c);//不可以
    return 0;
}

它们两调用的是同一个函数吗?

不是(可以看地址或汇编),它们只是类似,其实建立的栈帧、使用的指令都是不一样的。它们会在预处理阶段推演出对应代码需要的类型。

 函数模板的实例化

要经历:1.模板参数推演2.推演参数实例化

在解决问题时,调用的并不是同一个函数,例如解决int类型交换、double类型交换,在底层看,两个函数的地址是不一样的。

其实标准库里有一个swap,我们可以直接使用

注意,异或针对整型可以,但是对于浮点型那些,并不好 

注意如果传值传参,自定义类型是需要调用拷贝构造的。所以尽量用传引用传参。

传参之前(就会实例化,所以是在推演时报错的)

 这样可以

 第十一节1:09:00

//推演矛盾
template<class T>

T Add(const T& left, const T& right)
{
    return left + right;
}


int main()
{
    Add(1, 2);//编译。编译器自动推演,也叫隐式实例化
    Add(1.1, 2);//报错,编译不通过,模板T不明确,传参之前的一步错了,因为传参是可以隐式类型转换的。是在推演实例化时出错的,因为不知道是该推演成double类型还是int类型
    Add((int)1.1, 2);//可以自己强制类型转换
    Add(1.1, (double)2);

    //显式实例化。不用你编译器推了,我直接指定了。
    Add<int>(1.1, 2);
    Add<double>(1.1, 2);

    return 0;
}
//上面这个问题也可以给两个模板参数



template<typename T1, typename T2>//class和typename混用也是可以的。虽然是int和double,类型不一样,但是计算时是会隐式类型转换的,加完之后虽然是double类型,但是返回值是int,所以会有一个警告
T1 Add(const T1& left, const T2& right)
{
    return left + right;
}








template<class T>
T* Func(int n)
{
    T* a = new T[n];
    return a;
}

//如果有这样一个函数,直接调用这个函数是调不成的,因为编译器无法推演出返回值,没办法指定返回值,参数是一个跟T没有关系的返回值,是一个其他类型,这种必须显示实例化才能调用
Func(10);//不行
Func<int>(10);



//下面这两个可不可以同时存在?可以,调用的时候怎么走呢?
// 专门处理int的加法函数
int Add(int left, int right) 
{
    return left + right; 
}
// 通用加法函数
template<class T>
T Add(T left, T right) 
{
    return left + right; 
}

void Test() 
{
    Add(1, 2);       // 与非模板函数匹配,编译器不需要特化 
    Add<int>(1, 2);  // 调用编译器特化的Add版本
}
//编译器编译的时候不会有那个函数模板,是先去找有没有参数类型匹配的函数,如果有,就会优先调用,如果没有,才去找函数模板去实例化一个int的。有现成的先用现成的






//那么如果是这样的呢?
template<class T>
T Add(T left, T right) 
{
    return left + right; 
}


template<class T1, class T2>
T1 Add(T1 left, T2 right) 
{
    return left + right; 
}

Add(1.1, 2.2);//是调用第一个还是第二个呢?调用第一个
Add(1.1, 2);//这个是去调第二个




类模板

类模板都是显式实例化

当知道要开多少空间时,可以直接(100)给,例如知道要存100个数据,就提前给好,这样就能避免扩容时消耗

类模板的声明和定义分离

模板不支持分离编译。不支持声明放在.h,定义放在.cpp,原因:进阶讲

在同一个文件可以声明和定义分离,有时会编译报错,因为要在类外面使用类里面模板参数时,需要指定类域,而且不是这样指定Stack::应该是Stack<T>::,2:28:00

有些地方会把模板所在文件改名成hpp,hpp的意思是告诉我们它不仅有声明,还有实现,其实.h就可以,甚至不加.h都可以

模板也可以给缺省参数,不过它给的是类型

template<typename T = int>

就算给了缺省类型,实例化的时候也要写<>。例如:Stack<> s1;

 类模板的使用情况:如果一个要存char一个要存int

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

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

相关文章

商城小程序踩坑(一):iPhone 11、iPhoneX 等设备底部安全区域/小黑条适配

一、前言 这两天正在开发商城小程序-商品详情页&#xff0c;在做设备测试的时候突然发现详情页底部—— 购物车 和 购买区域在苹果手机上不适配&#xff0c;并且还存在小黑条。 底部功能没有办法正常使用。 如下图所示&#xff1a; 解决后效果&#xff0c;如下图所示&#xff…

Swagger之Hello World !

目录 ■1&#xff0e;前言・Swagger介绍 ■2&#xff0e;例子&#xff0c;如果基于Spring Boot项目&#xff0c;实现Swagger---非常简单 2&#xff0e;1&#xff0e;已有的SpringBoot项目 2&#xff0e;2&#xff0e;修改POM文件 2&#xff0e;3&#xff0e;添加Config文件…

html请求谷歌音频跨域问题(谷歌翻译接口)虚拟机ping不通google(下载谷歌音频、下载百度翻译音频)

文章目录 调用谷歌翻译接口&#xff0c;尝试了几种方案&#xff0c;都提示跨域不行第一种&#xff08;通过js代码获取音频文件的Blob对象&#xff0c;提示跨域了&#xff09;代码结果 第二种&#xff08;尝试新窗打开音频url&#xff0c;404&#xff0c;估计也是跨域了&#xf…

StarRocks Friends 广州站精彩回顾

上周六&#xff0c;StarRocks & Friends 活动在羊城广州成功举行&#xff0c;社区的小伙伴齐聚一堂&#xff0c;共同探讨了 StarRocks 在业界的应用实践和湖仓一体等热门话题。 本文总结了技术交流活动的关键内容和视频资料&#xff0c;感谢社区每一位小伙伴的支持和参与&…

如何提高接口测试覆盖率?

接口测试是测试系统组件间接口的一种测试。 接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。 测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 接口测试该如何提高测试的覆盖率呢&#…

PCL点云处理之最小二乘空间直线拟合(3D) (二百零二)

PCL点云处理之最小二乘空间直线拟合(3D) (二百零二) 一、算法简介二、实现代码三、效果展示一、算法简介 对于空间中的这样一组点:大致呈直线分布,散乱分布在直线左右, 我们可采用最小二乘方法拟合直线,更进一步地,可以通过点到直线的投影,最终得到一组严格呈直线分布…

软件测试一周面试十家公司,分享面试经历

从开始面试讲起&#xff0c;公司规模我分成5类&#xff1a;创业公司0-20人&#xff0c;小型公司20-40人&#xff0c;中小型50-99&#xff0c;中型公司100-499即将上市的那种&#xff0c;已上市公司100-499。 创业公司 第一个面试的那家创业公司特别坑&#xff0c;开始面试&am…

4年测试“我“该何去何从?测试还是测试开发?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 4年测试&#xff…

秋招备战笔试Day2

目录 单选 1.A 派生出子类 B &#xff0c; B 派生出子类 C &#xff0c;并且在 java 源代码有如下声明&#xff1a; 2.下面代码将输出什么内容&#xff1a;&#xff08;&#xff09; 3.阅读如下代码。 请问&#xff0c;对语句行 test.hello(). 描述正确的有&#xff08;&…

vlan access, trunk, hybrid (tagged/untagged) 笔记

vlan 接口和配置 PVID&#xff08;port vlan ID&#xff09; 定义 pvid 主要目的&#xff1a; 当交换机接口收到没有 vlan tag 标签的包时&#xff0c;接口会将定义的 pvid 作为当前包的 vlan id。当对映 pvid vlan 的包&#xff0c;通过当前交换机接口发出时&#xff0c;接…

ADSelfService Plus:保护密码安全的最佳解决方案

密码安全是当今数字时代中至关重要的话题。随着互联网和信息技术的迅速发展&#xff0c;我们的生活变得越来越数字化&#xff0c;密码已成为我们生活中不可或缺的一部分。然而&#xff0c;随着各种网络威胁和黑客攻击不断增加&#xff0c;保护我们的密码变得越来越重要。 密码安…

测试工程师刚入职如何快速熟悉需求并输出测试用例?

刚入职第一天&#xff0c;早上办完入职&#xff0c;下午就就分配了测试任务&#xff0c;2个模块13条短信验证&#xff0c;2天内输出测试用例&#xff08;xmind输出功能点&#xff0c;excel书写业务流&#xff09;。测试负责人给我们快速讲了一下业务&#xff0c;在这过程中大概…

openssl/bn.h: No such file or directory

报错截图 解决方法 ubuntu apt install libssl-dev -y centos yum install openssl-devel -y

echarts实现多层环图(复制粘贴即可)

data里面参数配置&#xff1a; // 多重环图optionCircle: {tooltip: {show: false,trigger: item,formatter: "{a} : {c} ({d}%)"},color: [#3AB1EB, #D48B6A, #5B41C8, #FE7E02],legend: {orient: horizontal,itemWidth: 30, // 图例标记的图形宽度。itemHeight…

从产品和运营的角度聊聊,如何有效吸引与引导用户注册转化?

从产品和运营的角度聊聊 如何有效吸引与引导用户注册转化&#xff1f; 正文共&#xff1a;4360字 23图 预计阅读时间&#xff1a;11分钟 1 如何进行改版&#xff0c;找找思路&#xff1f; 前段时间在做公司的网站改版策划&#xff0c;此前接触的都是一些ToB的解决方案提供商…

Jmeter脚本录制:抓取IOS手机请求包

现在移动端的项目越来越多&#xff0c;今天给大家介绍一下&#xff0c;在IOS下Jmeter如何抓包。 1、电脑连上wifi 2、Jmeter中配置“HTTP代理服务器” 1)启动Jmeter&#xff1b;2)“测试计划”中添加“线程组”&#xff1b;3)“测试计划”中添加“HTTP代理服务器”&#xff…

【算法很美】多维数组和字符串篇打卡(第三天)

文章目录 子矩阵的最大累加和整体代码 矩阵运算-乘法整体代码 检测字符串是否有重复字符整体代码 反转字符串整体代码 变形词整体代码 替换字符串中的空格整体代码 子矩阵的最大累加和 整体代码 package 每日算法学习打卡.算法打卡.七月份.七月三十一号;import java.util.Arra…

nginx配置访问本机文件夹里的静态资源404

在nginx中配置了location访问一直404 location /web/user/ { alias /home/user/wlds/user/;index index.html;try_files $uri $uri/ /index.html 404;} 看日志发现Permission denied 因为是直接使用的yum安装的二进制包nginx&#xff0c;nginx.conf文件首行是user nginx;所以没…

【DRAM存储器三】内存颗粒内部结构

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考资料&#xff1a;《镁光DDR4数据手册》 目录 DDR4颗粒的内部结构 …

[SSM]Spring6整合JUnit5与集成MyBatis3.5

目录 十七、Spring6整合JUnit5 17.1Spring对JUnit4的支持 17.2Spring对JUnit5的支持 十八、Spring6集成MyBatis3.5 18.1实现步骤 18.2具体实现 18.3spring配置文件的import 十七、Spring6整合JUnit5 17.1Spring对JUnit4的支持 准备工作&#xff1a; <dependencies&…