【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.rhkb.cn/news/220062.html

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

相关文章

大模型应用_FastGPT

1 功能 整体功能&#xff0c;想解决什么问题 官方说明&#xff1a;FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01;个人体会…

配置Nginx解决跨域问题

Nginx 中将前端请求中的所有以 “/apiUrl” 开头的路径代理到 http://192.12.200.101:9813 例如&#xff1a; /apiUrl/login > http://192.12.200.101:9813/login 配置nginx环境 进入Nginx 的配置文件编辑界面: sudo nano /etc/nginx/conf.d/default.conf开始编辑 defaul…

C# WPF上位机开发(动态添加控件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 写图形界面软件的时候&#xff0c;我们经常会遇到一种情况。那就是图形界面上面&#xff0c;显示的控件可能是不定的。有可能多&#xff0c;也有可…

PyTorch官网demo解读——第一个神经网络(2)

上一篇&#xff1a;PyTorch官网demo解读——第一个神经网络&#xff08;1&#xff09; 继上一篇文章我们展示了第一个神经网络的完整代码&#xff0c;今天我们来聊聊这个神经网络的模型设计。 这个demo实际上只使用了一个简单的线性模型&#xff1a;y wx b&#xff1b; 手写…

软件测试用例经典方法 | 单元测试法案例

单元测试又称模块测试&#xff0c;是对软件设计的最小单元的功能、性能、接口和设计约束等的正确性进行检验&#xff0c;检查程序在语法、格式和逻辑上的错误&#xff0c;并验证程序是否符合规范&#xff0c;以发现单元内部可能存在的各种缺陷。 单元测试的对象是软件设计的最…

微信小程序背景图片设置

问题 :微信小程序通过css:background-image引入背景图片失败 [渲染层网络层错误] pages/wode/wode.wxss 中的本地资源图片无法通过 WXSS 获取&#xff0c;可以使用网络图片&#xff0c;或者 base64&#xff0c;或者使用<image/>标签 解决方法微信小程序在使用backgroun…

HPM6750系列--第十篇 时钟系统

一、目的 上一篇中《HPM6750系列--第九篇 GPIO详解&#xff08;基本操作&#xff09;》我们讲解了HPM6750 GPIO相关内容&#xff0c;在进一步讲解其他外设功能之前我们有必要先讲解一下HPM6750的时钟系统。 时钟可以说是微控制器系统中的心脏&#xff0c;片上外设模块必须依赖时…

如何用Adobe Audition 检测波形的pop和卡顿

在Adobe Audition中&#xff0c;检测卡顿和pop的方法各有不同&#xff1a; 1. **检测卡顿**&#xff1a; - 使用“诊断”面板中的“删除静音”或“标记音频”选项可以帮助识别音频中的静音段落&#xff0c;这可能表明存在卡顿。 - 配置诊断设置&#xff0c;指定静音的振…

Linux中使用podman管理容器

本章主要介绍使用podman管理容器 了解什么是容器&#xff0c;容器和镜像的关系安装和配置podman拉取和删除镜像给镜像打标签导出和导入镜像创建和删除镜像数据卷的使用管理容器的命令使用普通用户管理容器 对于初学者来说&#xff0c;不太容易理解什么是容器&#xff0c;这里…

qt实现基本文件操作

先通过ui界面实现基本框架 接下来就要实现每个按键的功能了 我们先来实现新建的的功能&#xff0c;我们右键新建键&#xff0c;可以发现没有转到槽的功能&#xff0c;因此我们要自己写connect来建立关系。 private slots:void newActionSlot(); 在.h文件中加上槽函数。 conne…

DHTMLX Suite v8.3发布!深化JavaScript UI小部件库使用体验

DHTMLX UI 组件库允许您更快地构建跨平台、跨浏览器 Web 和移动应用程序。它包括一组丰富的即用式 HTML5 组件&#xff0c;这些组件可以轻松组合到单个应用程序界面中。 DHTMLX Suite v8.3已于近日正式发布啦&#xff01;这个更新附带了一组新特性和改进&#xff0c;旨在促进您…

产品入门第五讲:Axure交互和情境

目录 一.Axure交互和情境的介绍 1.交互介绍 概念 常见的Axure交互设计技巧 2.情境介绍 概念 常见的Axure情境设计技巧&#xff1a; 二.实例展示 1.ERP登录页到主页的跳转 2.ERP的菜单跳转到各个页面 &#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个…

2024最新FL Studio21.2MAC电脑版中文版下载安装步骤教程

FL Studio 简称FL&#xff0c;全称Fruity Loops Studio&#xff0c;因此国人习惯叫它"水果"。目前最新版本是FL Studio21.1.1.3750版本&#xff0c;它让你的计算机就像是全功能的录音室&#xff0c;大混音盘&#xff0c;非常先进的制作工具&#xff0c;让你的音乐突破…

基于网络爬虫技术的网络新闻分析

目录 前言 一、网络爬虫技术 二、代理IP 三、网络新闻分析 总结&#xff1a; 前言 随着互联网的发展和普及&#xff0c;网络新闻成为人们获取信息的重要途径。然而&#xff0c;由于网络新闻的数量庞大&#xff0c;分析和处理这些新闻变得愈发困难。本文将介绍如何使用网络…

TestSSLServer4.exe工具使用方法简单介绍(查SSL的加密版本SSL3或是TLS1.2)

一、工具使用方法介绍 工具使用方法参照&#xff1a;http://www.bolet.org/TestSSLServer/ 全篇英文看不懂&#xff0c;翻译了下&#xff0c;能用到的简单介绍如下&#xff1a; 将下载的TestSSLServer4.exe工具放到桌面上&#xff0c;CMD命令行进入到桌面目录&#xff0c;执…

如何免费搭建私人电影网站(一)

前言&#xff1a;在线看电影经常会出现烦人的广告&#xff0c;为了不浪费时间看广告&#xff0c;有必要做自己的专属网站。 准备工作&#xff1a; 1、申请免费域名&#xff08;也可以花钱注册域名相对稳定&#xff09;链接: 申请免费域名方法 2、申请免费主机&#xff08;也可以…

社交网络分析3:社交网络隐私攻击、保护的基本概念和方法 + 去匿名化技术 + 推理攻击技术 + k-匿名 + 基于聚类的隐私保护算法

社交网络分析3&#xff1a;社交网络隐私攻击、保护的基本概念和方法 去匿名化技术 推理攻击技术 k-匿名 基于聚类的隐私保护算法 写在最前面社交网络隐私泄露用户数据暴露的途径复杂行为的隐私风险技术发展带来的隐私挑战经济利益与数据售卖防范措施 社交网络 用户数据隐私…

python排序算法,冒泡排序和快排

对于排序算法中比较知名的两个算法&#xff0c;分别就是冒泡排序和快速排序&#xff0c;在日常学习和使用中都会听到这两种排序算法的名称&#xff0c;这里主要介绍如何使用python来实现这两种排序算法。 冒泡排序的实现&#xff1a;一是从集合第一个元素开始&#xff0c;每两…

饥荒Mod 开发(十四):制作屏幕弹窗

饥荒Mod 开发(十三)&#xff1a;木牌传送 在上一个文章里面制作了一个传送选择页面&#xff0c;是一个全屏的窗口&#xff0c;那饥荒中如何制作一个全屏的窗口&#xff0c;下面介绍一下如何从零开始制作一个全屏窗口 制作屏幕窗口 饥荒中的全屏窗口都有一个基类 “Screen”,我…

20231218给Firefly的AIO-3399J【RK3399】开发板刷Android12挖掘机方案

20231218给Firefly的AIO-3399J【RK3399】开发板刷Android12挖掘机方案 2023/12/18 21:07 一、整体编译Rockchip的的Android12的挖掘机方案&#xff01; 由于RK3399的Android12系统默认是IND工业方案&#xff0c;需要修改一下【为挖掘机方案】。 Z:\3TB\81rk_android12_220722\…