【C++】模板

这篇博客来说一下模板,模板有函数模板类模板,先来看函数模板,你一听模板这个词就是提前给好一个模具,等我们用的时候在去套用
比如说:我们在实际应用中常常用到swap这个交换函数,但是呢,我们要交换的类型可能有很多种,我们总不能每一种类型都写一个函数,那样代码就特别的冗余和麻烦,这时呢,祖师爷就想到了用模板,既然在每个交换函数中只有类型是不同的,那么就把类型单拿出来,从而就有了一个模板

template<typename T>
void Swap(T& x, T& y) {T tmp = x;x = y;y = tmp;
}

这是一个swap函数的模板,其中第一行的T是我们随便给的一个名字,可以去替换,要和下面的保持一致,typename也可以换成class,在当前阶段我们认为它们是相同的。我们在函数调用的时候就可以传不同类型的参数
在这里插入图片描述
那这里不是自动去推算参数的类型吗?那我可不可以用auto呢?当然是不可以的,因为auto是不能做函数参数的类型的,auto只有在变量定义的时候去使用,通过右值自动去推变量的类型
在这里插入图片描述
那么再回到上面这个ab和cd交换来,我想问,这两组交换调用的是不是同一个函数呢?答案是不是,因为我们给定的只是一个模板,它要交换的话还是要去生成对应的函数,这些都让编译器给干了,通过汇编的话我们也可以看到
在这里插入图片描述
我们可以看到call指令后面调用的函数以及地址都是不同的,这也恰恰印证了我们的上边
现在我们已经弄明白了只有一种模板参数的情况,那如果有多个模板参数呢?其实就在后面在加一个就行了

template <class T1, class T2>
void func(const T1& x, const T2& y) {cout << x << endl;cout << y << endl;
}
int main() {func(1, 1);func(2.2, 2.2);func(3, 6.6);return 0;
}

这么调用都是可以的,虽然我有两个模板参数T1,T2,但是我让它们两个指向同一种类型也是可以的,但是我不能定义两个模板参数,但是只用一个
在这里插入图片描述
它的报错是
在这里插入图片描述
现在我们也知道了多个模板参数怎么用,在我们的上面的情况当中,编译器都能自动推导出每种模板参数指向的类型,这就叫做推演实例化,但是有的情况编译器是推不出来的,这时就需要我们显示实例化调用了,比如说:

template<class T>
T*& func(int n) {T* ptr = new T[n];return ptr;
}

你去调用的话,通过传递参数是不能推导出模板参数是什么类型,这时我们就需要显式实例化调用,就像下面这样
在这里插入图片描述
在这里插入图片描述
这段代码就是我就让T是int,我要传一个double的值,它就会做隐式类型转换成int,这就是我们的显式实例化调用
下边是普通函数和函数模板是可以同时存在,编译器就会有现成的就调用现成的,没有现成的就会用模板去生成一个函数,如果连模板函数都没有的话,就会去调用一个参数类型不同的,但是可以进行隐式类型转换的函数
就像这种情况
在这里插入图片描述
请添加图片描述
说完函数模板之后是我们的类模板,类模板有什么作用呢?
比如说我们要创建两个栈,一个栈要存放整形数据,一个要存放浮点型数据,这时我们的类模板就显得尤为重要了,那你可能会说我们之前不是会进行typedef吗?但我们这里是要求它们同时存在,那你还是得写两份栈的代码才行,所以typedef是不行的,这时我们就可以这么写

template<class T>
class stack {
public:private:T* _a;int _top;int _capacity;
};int main() {stack<int>st1;stack<double>st2;return 0;
}

这时我们就必须得显式实例化调用了,它们显示实例化的类型不同,自然不是同一种类
还有一个问题,对于一个普通类来说,类名就是类型,但是对于我们的类模板创建的类来说,类名<数据类型>才是我们的类型,就比如上面的
在这里插入图片描述
我们又知道对于构造函数来说,类名就是函数名,而不是类型名

在这里插入图片描述

另外,我们如果想把类里面的成员函数声明定义分离,要这么干
在这里插入图片描述

这是一个构造函数,要给定模板句,给定类域和模板参数,并且也不能分到两个文件中

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

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

相关文章

phpMyAdmin的常见安装位置

nginx的日志显示有人一直在尝试访问phpMyAdmin的setup.php&#xff0c;用了各种位置。 其实我只有一个nginx&#xff0c;别的什么也没有。 47.99.136.156 - - [01:44:37 0800] "GET http://abc.com:80/phpMyAdmin/scripts/setup.php HTTP/1.0" 404 162 "-"…

VUE中的8种常规通信方式

文章目录 1.props传递数据(父向子)2.$emit触发自定义事件&#xff08;子向父&#xff09;3.ref&#xff08;父子&#xff09;4.EventBus&#xff08;兄弟组件&#xff09;5.parent或root&#xff08;兄弟组件&#xff0c;有共同祖辈&#xff09;6.attrs和listeners&#xff08;…

海安行车记录仪avi杀病毒导致文件丢失的恢复案例

海安行车记录仪&#xff0c;听名字就知道是个小小小品牌&#xff0c;而且用的文件格式是比较古老的AVI&#xff0c;这种文件格式是微软设计的&#xff0c;后来并没有普及&#xff08;不支持4G以上大文件而且结构过于松散&#xff09;。这个恢复案例比较特殊的地方是不太清楚做过…

[NCTF2019]Fake XML cookbook1

提示 xml注入 一般遇到像登录页之类的就因该想到sql注入、弱口令或者xml等 随便输入抓包 这里明显就是xml注入 这里我们来简单了解一下xml注入 这里是普通的xml注入 xml注入其实和sql注入类似&#xff0c;利用了xml的解析机制如果系统没有将‘<’‘>’进行转义&#xff0…

Ubuntu18.04.6下samba服务的安装及配置

目录 01 安装samba服务&#xff1a; 03 重启samba服务 04 设置samba登录密码 05 测试 前言 从本章开始我们将要学习嵌入式音视频的学习了 &#xff0c;使用的瑞芯微的开发板 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博…

SearchWP WordPress高级网站内容搜索插件(包含所有专业扩展)

点击阅读SearchWP WordPress高级网站内容搜索插件(包含所有专业扩展)原文 SearchWP WordPress高级网站内容搜索插件是一个非常强大的工具&#xff0c;可以显着增强您网站的搜索功能。通过向网站访问者提供高度相关和精确的搜索结果&#xff0c;它可以有效地简化他们的搜索过程…

Leetcode的AC指南 —— 链表:24. 两两交换链表中的节点

摘要&#xff1a; Leetcode的AC指南 —— 链表&#xff1a;24. 两两交换链表中的节点。题目介绍&#xff1a;给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能…

RabbitMQ手动应答

1.SleepUtil线程睡眠工具类 package com.hong.utils;/*** Description: 线程睡眠工具类* Author: hong* Date: 2023-12-16 23:10* Version: 1.0**/ public class SleepUtil {public static void sleep(int second) {try {Thread.sleep(1000*second);} catch (InterruptedExcep…

eNSP小实验--实现全网互通

目录 一、建立以下拓扑图&#xff0c;并实现全网互通 二、分析 1、接入层交换机SW4、SW5划分vlan 2、汇聚层交换机SW2,SW3配置ip作为vlan网关&#xff0c;与SW1直连 3、核心交换机SW1配置ip 与汇聚层交换机和R1直连 4、SW1,SW2,SW3,R1配置静态路由&#xff0c;使得vlan10,…

Content-Type是什么

目录 Content-Type是什么 获取方式 设置方式 常见类型 application/x-www-form-urlencoded multipart/form-data application/json text/xml text/html text/plain Content-Type是什么 Content-Type出现在请求标头和响应标头中&#xff0c;意思是内容类型&#xff0…

直线追踪

由于项目的需要&#xff0c;最近在做一个直线追踪的东西&#xff0c;但是网上的代码关于车道线或者别的什么之类的直线追踪的代码只是提了一下&#xff0c;相关的代码并不是公开的&#xff0c;所以自己写了一些直线追踪的代码。 代码使用的是kalman滤波进行直线追踪&#xff0…

c语言-全局变量与局部变量

目录 1、&#xff08;作用&#xff09;域的概念 2、全局与局部的相对性 3、生命周期 3、静态变量static 结语&#xff1a; 前言&#xff1a; 在c语言中&#xff0c;全局变量的可见范围是整个工程&#xff0c;而局部变量的可见范围从该变量被定义到该作用域结束&#xff0c…