当前位置: 首页 > article >正文

【落羽的落羽 C++】模板简介

在这里插入图片描述

文章目录

  • 一、模板的引入
  • 二、函数模板
    • 1. 函数模板的使用
    • 2. 函数模板的原理
    • 3. 函数模板的实例化
    • 4. 函数模板的匹配
  • 三、类模板

一、模板的引入

假如我们想写一个Swap函数,针对每一种类型,都要函数重载写一次,但它们的实现原理是几乎一样的。在这种情况下,重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现,都需要用户自己增加对应的函数,并且代码的可维护性也较低。

void Swap(int& x, int& y)
{int tmp = x;x = y;y = tmp;
}void Swap(double& x, double& y)
{double tmp = x;x = y;y = tmp;
}void Swap(char& x, char& y)
{char tmp = x;x = y;y = tmp;
}

前人也想到了这个问题,于是,泛型编程和模板的概念就诞生了:
泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。
模板是泛型编程的基础。模板一般分为函数模板、类模板。

二、函数模板

1. 函数模板的使用

函数模板代表了一系列函数,这一系列函数可能只有类型不同的区别。函数模板与类型无关,在使用时被参数化,根据实参类型产生特定类型版本的具体函数。

使用方法是:

template<typename T1, typename T2, ......, typename Tn>
返回值类型 函数名(参数列表)
{函数内容
}

其中
template是定义模板的关键字。typename是用来定义模板参数类型的关键字,也可以用class替代,不能用struct替代。
T1、T2、…、Tn是用户自己命名的类型代名词,代表着一种类型,在模板产出特定类型版本的具体函数时才能确定它们是什么类型。

举个简单的例子就明白了:我们用函数模板来实现Swap函数

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

在这里插入图片描述

再试试用函数模板实现泛用的加法函数:

template<typename T1>
T1 Add(T1& x, T1& y)
{return x + y;
}

在这里插入图片描述
很好理解吧。

2. 函数模板的原理

而函数模板的原理也不难理解。函数模板可以理解为一个蓝图,它本身并不是函数,是编译器产出特定具体类型函数的模具,模板其实就是将本来应该我们自己做的重复性工作交给了编译器。
在编译器编译阶段,对于函数模板的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供使用,比如:当用double类型使用函数模板时,编译器判断实参类型是double,将T确定为double类型,然后产生一份专门处理double类型的函数代码。

在这里插入图片描述

3. 函数模板的实例化

用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化可以分为隐式实例化、显式实例化

  • 隐式实例化:编译器根据实参推演参数的实际类型,也就是我们刚才举例的用法。要注意的是,在Swap和Add这类只有一种参数的函数模板,使用时最好不要出现两个参数类型不一样的情况,比如不要同时将一个int和一个double参数传给Add函数。真遇到了这种情况,有两种解决方法:强制类型转换Add(i, (int)d)、使用显式实例化。
  • 显示实例化:在函数名后<>中指定模板参数的实际类型,如Add<int>(a, b);Swap<double>(x, y);,如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功则报错。

4. 函数模板的匹配

一个非模板函数可以和同名的函数模板同时存在,而且该函数模板还能被实例化为这个非模板函数。对于这两个函数,如果其他条件都相同,则在调用时会优先调用非模板函数而不是从模板实例化出一个函数;如果模板可以产生一个具有更好匹配的函数,那么编译器可能将使用模板。

int Add(int x, int y)
{return x + y;
}template<typename T1, typename T2>
T1 Add(T1& x, T2& y)
{return x + y;
}Add(1, 2); //调用非模板Add函数
Add(1, 2.0); //都可以调用,具体看编译器的选择

三、类模板

模板也可以用到类的上面,

template<typename T1, typename T2, ......, typename Tn>
class 类名
{类内容
}

一个类模板的使用实例是,一系列数据结构的定义,如:

template<typename T>
class Stack
{
public:Stack(size_t capacity = 4){_arr = new T[capacity];_capacity = capacity;_size = 0;}~Stack(){delete[] _arr;}
private:T* _arr;size_t _capacity;size_t _size;
};

类模板实例化与函数模板实例化不同,类模板实例化必须在类模板名字后跟<>,将实例化的类型写在里面,类模板不是真正的类,而实例化出的结果才是真正的类。

这样,在使用栈这个数据结构时,根据我们要存储的数据类型,可以通过Stack<类型>的形式来控制:

Stack<int> st1; //存储int的栈
Stack<char> st2; //存储char的栈

在这里插入图片描述

本篇完,感谢阅读。

相关文章:

【落羽的落羽 C++】模板简介

文章目录 一、模板的引入二、函数模板1. 函数模板的使用2. 函数模板的原理3. 函数模板的实例化4. 函数模板的匹配 三、类模板 一、模板的引入 假如我们想写一个Swap函数&#xff0c;针对每一种类型&#xff0c;都要函数重载写一次&#xff0c;但它们的实现原理是几乎一样的。在…...

USB(通用串行总线)数据传输机制和包结构简介

目录 1. USB的物理连接电缆结构时钟恢复技术 2. USB的数据传输方式包&#xff08;Packet&#xff09; 3. 包的传输规则帧和微帧 4. 包的结构1. 同步字段&#xff08;Sync&#xff09;2. 包标识符字段&#xff08;PID&#xff09;3. 数据字段4. 循环冗余校验字段&#xff08;CRC…...

【目标检测】【深度学习】【Pytorch版本】YOLOV3模型算法详解

【目标检测】【深度学习】【Pytorch版本】YOLOV3模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV3模型算法详解前言YOLOV3的模型结构YOLOV3模型的基本执行流程YOLOV3模型的网络参数 YOLOV3的核心思想前向传播阶段反向传播阶段 总结 前言 YOLOV3是由华盛顿…...

【前端扫盲】postman介绍及使用

Postman 是一款专为 API 开发与测试设计的 全流程协作工具&#xff0c;程序员可通过它高效完成接口调试、自动化测试、文档管理等工作。以下是针对程序员的核心功能介绍和应用场景说明&#xff1a; 一、核心功能亮点 接口请求构建与调试 支持所有 HTTP 方法&#xff08;GET/POS…...

每日c/c++题 备战蓝桥杯(全排列问题)

题目描述 按照字典序输出自然数 1 到 n 所有不重复的排列&#xff0c;即 n 的全排列&#xff0c;要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 n。 输出格式 由 1∼n 组成的所有不重复的数字序列&#xff0c;每行一个序列。 每个数字保留 5 个场…...

IdeaVim-AceJump

‌AceJump 是一款专为IntelliJ IDEA平台打造的开源插件&#xff0c;旨在通过简单的快捷键操作帮助用户快速跳转到编辑器中的任何符号位置&#xff0c;如变量名、方法调用或特定的字符串‌。无论是大型项目还是日常编程&#xff0c;AceJump 都能显著提升你的代码导航速度和效率。…...

BMS电池关键参数及其含义

BMS概述 BMS的定义与功能 BMS&#xff0c;即电池管理系统&#xff0c;是电池系统的核心控制设备&#xff0c;充当着电池的“状态观测器”。它通过传感器采集电池的单体电压、温度、电流等关键参数&#xff0c;并利用电子控制单元&#xff08;ECU&#xff09;进行数据处理和分…...

DataFrame行索引操作以及重置索引

一.DataFrame行索引操作 1.1 获取数据 1.1.1 loc 选取数据 df.loc[ ] 只能使用标签索引&#xff0c;不能使用整数索引。 当通过标签索引的切片方式来筛选数据时&#xff0c;它的取值前闭后闭。 传参&#xff1a; 1.如果选择单行或单列&#xff0c;返回的数据类型为 Series…...

DayDreamer: World Models forPhysical Robot Learning

DayDreamer&#xff1a;用于物理机器人学习的世界模型 Philipp Wu* Alejandro Escontrela* Danijar Hafner* Ken Goldberg Pieter Abbeel 加州大学伯克利分校 *贡献相同 摘要&#xff1a;为了在复杂环境中完成任务&#xff0c;机器人需要从经验中学习。深度强化学习是机器人学…...

线性欧拉筛

线性筛&#xff1a;高效求解素数 在数论中&#xff0c;素数的筛选是一个经典的问题。最常见的素数筛选方法是埃拉托斯特尼筛法&#xff0c;其时间复杂度为 O ( n log ⁡ log ⁡ n ) O(n\log \log n) O(nloglogn)&#xff0c;非常适合求解小范围内的素数。随着问题规模的增大&…...

Flutter vs React Native:跨平台移动开发框架对比

文章目录 前言1. 框架概述什么是 Flutter&#xff1f;什么是 React Native&#xff1f; 2. 性能对比Flutter 的性能表现React Native 的性能表现总结&#xff1a; 3. 开发体验对比3.1 开发效率3.2 UI 组件库 4. 生态系统对比5. 适用场景分析6. 结论&#xff1a;如何选择&#x…...

用matlab搭建一个简单的图像分类网络

文章目录 1、数据集准备2、网络搭建3、训练网络4、测试神经网络5、进行预测6、完整代码 1、数据集准备 首先准备一个包含十个数字文件夹的DigitsData&#xff0c;每个数字文件夹里包含1000张对应这个数字的图片&#xff0c;图片的尺寸都是 28281 像素的&#xff0c;如下图所示…...

AI辅助开发插件

适合Java程序员的AI辅助开发插件&#xff0c;按功能和适用场景分类&#xff1a; 1. 飞算JavaAI • 特点&#xff1a;从需求分析到代码生成的全流程智能引导&#xff0c;支持Maven、Gradle等主流工具&#xff0c;一键生成完整工程代码&#xff0c;包括配置文件、源代码和测试资…...

【AI4CODE】5 Trae 锤一个基于百度Amis的Crud应用

【AI4CODE】目录 【AI4CODE】1 Trae CN 锥安装配置与迁移 【AI4CODE】2 Trae 锤一个 To-Do-List 【AI4CODE】3 Trae 锤一个贪吃蛇的小游戏 【AI4CODE】4 Trae 锤一个数据搬运工的小应用 1 百度 Amis 简介 百度 Amis 是一个低代码前端框架&#xff0c;由百度开源。它通过 J…...

npm webpack打包缓存 导致css引用地址未更新

问题如下&#xff1a; 测试环境配置&#xff1a; publicPath: /chat/,生产环境配置&#xff1a; publicPath: /,css中引用背景图片 background-image: url(/assets/images/calendar/arrow-left.png);先打包测试环境&#xff0c;观察打包后的css文件引用的背景图片地址 可以全…...

ollama导入huggingface下载的大模型并量化

1. 导入GGUF 类型的模型 1.1 先在huggingface 下载需要ollama部署的大模型 1.2 编写modelfile 在ollama 里面输入 ollama show --modelfile <你有的模型名称> eg: ollama show --modelfile qwen2.5:latest修改其中的from 路径为自己的模型下载路径 FROM /Users/lzx/A…...

Java 集合 Map Stream流

目录 集合遍历for each map案例 ​编辑 这种数组的遍历是【index】​编辑map排序【对象里重写compareTo​编辑map排序【匿名内部类lambda​编辑 stream流​编辑 ​编辑获取&#xff1a; map的键是set集合&#xff0c;获取方法map.keySet() map的值是collection 集合&…...

记录一下零零散散的的东西-ImageNet

ImageNet 是一个非常著名的大型图像识别数据集&#xff0c; 数据集基本信息 内容说明&#x1f4f8; 图像数量超过 1400万张图片&#xff08;包含各类子集&#xff09;&#x1f3f7;️ 类别数量常用的是 ImageNet-1K&#xff08;1000类&#xff09;&#x1f9d1;‍&#x1f3e…...

【网络安全实验】PKI(证书服务)配置实验

目录 一、PKI相关概念 1.1 定义与核心功能 1.2 PKI 系统的组成 1.证书颁发机构&#xff08;CA, Certificate Authority&#xff09; 2.注册机构&#xff08;RA, Registration Authority&#xff09; 3.数字证书 1.3 PKI 的功能 1.4 PKI认证体系&#xff1a; 工作流程 …...

【数据集】多视图文本数据集

多视图文本数据集指的是包含多个不同类型或来源的信息的文本数据集。不同视图可以来源于不同的数据模式&#xff08;如原始文本、元数据、网络结构等&#xff09;&#xff0c;或者不同的文本表示方法&#xff08;如 TF-IDF、词嵌入、主题分布等&#xff09;。这些数据集常用于多…...

学透Spring Boot — 007. 七种配置方式及优先级

Spring Boot 提供很多种方式来加载配置&#xff0c;本文我们会用Tomcat的端口号作为例子&#xff0c;演示Spring Boot 常见的配置方式。 几种配置方式 使用默认配置 新建一个项目什么都不配置&#xff0c;Spring Boot会自动配置Tomcat端口号。 启动日志 TomcatWebServer :…...

元素定位-xpath

xpath其实就是一个path(路径)&#xff0c;一个描述页面元素位置信息的路径&#xff0c;相当于元素的坐标xpath基于XML文档树状结构&#xff0c;是XML路径语言&#xff0c;用来查询xml文档中的节点。 绝对定位 从根开始找--/(根目录)/html/body/div[2]/div/form/div[5]/button缺…...

【youcans论文精读】弱监督深度检测网络(Weakly Supervised Deep Detection Networks)

欢迎关注『youcans论文精读』系列 本专栏内容和资源同步到 GitHub/youcans 【youcans论文精读】弱监督深度检测网络 WSDDN 0. 弱监督检测的开山之作0.1 论文简介0.2 WSDNN 的步骤0.3 摘要 1. 引言2. 相关工作3. 方法3.1 预训练网络3.2 弱监督深度检测网络3.3 WSDDN训练3.4 空间…...

网络购物谨慎使用手机免密支付功能

在数字经济蓬勃发展的当下&#xff0c;“免密支付”成为许多人消费时的首选支付方式。 “免密支付”的存在有其合理性。在快节奏的现代生活中&#xff0c;时间愈发珍贵&#xff0c;每节省一秒都可能带来更高的效率。以日常通勤为例&#xff0c;上班族乘坐交通工具时&#xff0c…...

Sentinel[超详细讲解]-4

&#x1f693; 主要讲解流控模式的 三种方式中的两种&#xff1a; 直接、链路&#x1f680; 1️⃣ 直接模式 &#x1f68e; 直接模式&#xff1a;对资源本身进行限流&#xff0c;例如对某个接口进行限流&#xff0c;当该接口的访问频率超过设定的阈值时&#xff0c;直接拒绝新的…...

【服务日志链路追踪】

MDCInheritableThreadLocal和spring cloud sleuth 在微服务架构中&#xff0c;日志链路追踪&#xff08;Logback Distributed Tracing&#xff09; 是一个关键需求&#xff0c;主要用于跟踪请求在不同服务间的调用链路&#xff0c;便于排查问题。常见的实现方案有两种&#x…...

【行测】判断推理:图形推理

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;读不在三更五鼓&#xff0c;功只怕一曝十寒。 > 目标&#xff1a;掌握 图形推理 基本题型&#xff0c;并能运用到例题中。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! …...

OpenCV 图形API(12)用于计算图像或矩阵的平均值函数mean()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算矩阵元素的平均值&#xff08;均值&#xff09;。 mean函数计算矩阵元素的平均值M&#xff0c;每个通道独立计算&#xff0c;并返回该值。 …...

Oracle触发器使用(一):DML触发器

Oracle触发器使用(一):DML触发器 DML触发器条件谓词触发器INSTEAD OF DML触发器复合DML触发器Oracle数据库中的触发器(Trigger)本质上也是PL/SQL代码,触发器可以被Enable或者Disable,但是不能像存储过程那样被直接调用执行。 触发器不能独立存在,而是定义在表、视图、…...

3D模型给可视化大屏带来了哪些创新,都涉及到哪些技术栈。

一、3D 模型给可视化大屏带来的创新 更直观的视觉体验 传统的可视化大屏主要以二维图表和图形的形式展示数据&#xff0c;虽然能够传达一定的信息&#xff0c;但对于复杂的场景和数据关系&#xff0c;往往难以直观地呈现。而 3D 模型可以将数据以三维立体的形式展示出来&#…...