C++5:初见模板

news2024/10/6 2:26:08

目录

函数模板

 函数模板的实例化:

隐式实例化

显示实例化

类模板


虽然学习了类和对象,能很方便的处理一些容器类的问题,但是我们还是会遇到如下这种情况。

我们创建一个简单的stack类

class Stack
{
public:
    Stack()
    {}
private:
    int* _a;
    size_t _top;
    size_t _capacity;
};

我们单独处理int类型需要使用栈结构的时候还好说,假如我们需要使用double或者其他类型的变量时,操作会变得很难受,复制一段改数据类型吗?代码变得膨大不说还难以管理,诚然我们可以使用typedef来方便修改,可是每一次运行都要更改还是挺蛋疼的。


所以为了应对一些函数仅仅只是传参数据类型不同,但是逻辑相同而需要重载函数的情况,C++给出了模板。

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

用起来嘎嘎顺手,嘎嘎好用。

如上所记述的是函数模板,我们还有类模板,我们一个个来看

函数模板

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

注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

上文所展示的函数模板其实是类似于蓝图的样式,本身需要我们自己思考编写对应类型的这个过程被模板参数所取代,这个过程取而代之变成了编译器的工作,也就是推导的过程成了编译器的事情,我们可以在这方面偷懒了。

编译器推到的大致过程如下:

 当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然
后产生一份专门处理double类型的代码,int也是同理。

模板的这种工作原理很像用模具做冰棍不是吗?同一个模具生产出不同口味的冰棍


 函数模板的实例化:

实例化有两种方式:显示实例化,隐式实例化

隐式实例化

我们上文所述的方法就是隐式实例化,通过对函数模板传递参数来让编译器自己推演得到对应的参数类型并生成对应类型的函数。

但其实我们不能去依赖编译器的推演能力,因为它本身的推演能力不太行,具体体现如下文:

虽然说我们上文的交换函数是完全没啥问题的,但是如果换成两个不同的类型让编译器去尝试推导就不行了。比如我们的Swap函数,我们分别传一个int和double进去

 因为我们本身的模板参数只有一个T,传过来第一个T编译器推导为int,而第二个是个double就把编译器干懵了,那这个T到底是int还是double?

解决办法:

1.多加一个模板参数


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

2.使用者自己强制类型转换

当然对于Swap函数来讲这个也是不起作用的,所以为了举例换成Add函数

 当然,还有其他的办法来弥补编译器推演能力不足的问题,显式实例化就是其中之一。

显示实例化

显示实例化的本质就是不再让编译器推演,我们直接指定传入的变量类型,具体操作是在函数名后的<>中指定模板参数的实际类型

int main()
{
	int a1 = 10, a2 = 20;
	double d1 = 10.0, d2 = 20.0;
	Add<int>(a1, d1);

}

 我们可以看到,编译器直接将两个模板参数变量都变成了int类型,但其实在这个过程中还是发生了隐式类型转换。

类模板

上文我们把模板参数套在了函数头上,我们也可以套到类形成类模板。

template<class T1, class T2, ..., class Tn>
class 类模板名
{
    // 类内成员定义
};

以STL举例,STL各种容器指定存放数据类型的基本实现就是依仗于模板的,比如Vector

int main()
{
    vector<int> v1;
}

我们在类模板名后传入指定需要的变量类型,编译器就会生成对应类型的类。

学习了基本的模板就可以去玩一玩STL了。

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

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

相关文章

【机器学习】Logistic Regression 逻辑回归算法详解 + Java代码实现

文章目录一、逻辑回归简介1.1 什么是逻辑回归1.2 Sigmoid函数1.3 预测函数二、逻辑回归实战 - Java代码实现一、逻辑回归简介 1.1 什么是逻辑回归 逻辑回归&#xff08;Logistic Regression&#xff09;是一种用于解决二分类&#xff08;0 or 1&#xff09;问题的机器学习方法…

时间序列模型SCINet模型(自定义项目)

前言 读完代码解析篇&#xff0c;我们针对开源项目中的模型预测方法做一下介绍。Github源码下载地址下载数据集ETTh、PEMS、Traffic、Splar-Energy、Electricity、Exchange-Rate&#xff0c;这几类公共数据集的任意一类就行。这里以ETTh数据集为例&#xff0c;先在项目文件夹下…

whistle抓包工具应用

原文地址&#xff1a;(67条消息) whistle抓包工具学习_BBC蟹耳总的博客-CSDN博客_w2 抓包 一、安装whistle 首先安装好whistle抓包工具&#xff0c;有以下两个步骤 在终端中全局安装whistle&#xff1a;npm install -g whistle可以通过whistle help查看相关信息&#xff0c;…

《零基础学机器学习》读书笔记一

《零基础学机器学习》读书笔记一 一、机器学习快速上手路径 1.1 机器学习的家族谱 人工智能&#xff0c;可以被简单地定义为努力将通常由人类完成的智力任务自动化。 AI效应的2个阶段&#xff1a; &#xff08;1&#xff09;AI将新技术、新体验带进人类的生活&#xff0c;完…

linux环境安装mysql5.7版本

目录 一、下载准备阶段 二、安装运行阶段 linux环境安装mysql是我们工程师必备的技能之一&#xff0c;今天我们实战分享一下安装流程&#xff1a; 一、下载准备阶段 1、查看linux系统是否已经安装mysql rpm -qa|grep -i mysql 显示没有 如果安装过&#xff0c;可以删除&…

DFS排列组合与连通性

目录 一、前言 二、DFS与排列组合 1、DFS&#xff1a;自写排列算法1 &#xff08;1&#xff09;基础模板 &#xff08;2&#xff09;基于(1)输出前n个数任意m个都全排列 2、DFS&#xff1a;自写排列算法2&#xff08;这个写法更常见&#xff09; &#xff08;1&#xff…

Java安装详细教程

这里写自定义目录标题Java安装详细教程1.下载Java2&#xff0c;找到jdk8进行下载3.安装jdk4.配置环境变量5.查看是否已经成功安装Java安装详细教程 换了新电脑了&#xff0c;需要安装Java&#xff0c;如果对你也有帮助就点个赞吧~~ 文章目录Java安装详细教程1.下载Java2&#…

一阶低通滤波器学习

导读&#xff1a;电压型磁链观测器由于物理概念清晰、简单易用而备受关注。然而电压型磁链观测器包含一纯积分项&#xff0c;被积项的初始相位与直流偏置都会影响积分结果。所以对传统电压型磁链观测器的改进措施有很多&#xff0c;本期文章主要介绍采用一阶低通滤波器来替换掉…

Java程序设计实验2 | Java语言基础

*本文是博主对Java各种实验的再整理与详解&#xff0c;除了代码部分和解析部分&#xff0c;一些题目还增加了拓展部分&#xff08;⭐&#xff09;。拓展部分不是实验报告中原有的内容&#xff0c;而是博主本人自己的补充&#xff0c;以方便大家额外学习、参考。 目录 一、实验…

微信小程序使用npm包、全局数据共享和分包

文章目录导航路线使用 npm 包小程序对 npm 的支持与限制Vant Weapp1. 什么是 Vant Weapp2. 安装 Vant 组件库3. 使用 Vant 组件4. 定制全局主题样式5. 定制全局主题样式API Promise化1. 基于回调函数的异步 API 的缺点2. 什么是 API Promise 化3. 实现 API Promise 化4. 调用 P…

鸣人的影分身(动态规划 | DP | 整数划分模型)[《信息学奥赛一本通》]

题目如下&#xff1a; 在火影忍者的世界里&#xff0c;令敌人捉摸不透是非常关键的。 我们的主角漩涡鸣人所拥有的一个招数——多重影分身之术——就是一个很好的例子。 影分身是由鸣人身体的查克拉能量制造的&#xff0c;使用的查克拉越多&#xff0c;制造出的影分身越强。…

6.R语言【频数、频率统计函数】一维、二维、三维

b站课程视频链接&#xff1a; https://www.bilibili.com/video/BV19x411X7C6?p1 腾讯课堂(最新&#xff0c;但是要花钱&#xff0c;我花99&#x1f622;&#x1f622;元买了&#xff0c;感觉讲的没问题&#xff0c;就是知识点结构有点乱&#xff0c;有点废话&#xff09;&…

PostgreSQL数据库FDW——Parquet S3 MultifileMergeExecutionStateBaseS3

MultifileMergeExecutionStateBaseS3和SingleFileExecutionStateS3、MultifileExecutionStateS3类不同&#xff0c;reader成员被替换为ParquetReader *类型的readers vector。新增slots_initialized布尔变量指示slots成员是否已经初始化。slots成员是Heap类&#xff0c;Heap用于…

重装系统Windows10纯净版操作步骤(微pe)

目录 前言 操作步骤 第一步&#xff1a;格式化硬盘 第二步&#xff1a;硬盘重新分区 固态硬盘分区 机械硬盘分区 完成效果展示 第三步&#xff1a;把ISO镜像文件写入固态硬盘 第四步&#xff1a;关机拔u盘 第五步&#xff1a;开机重装系统成功 前言 1.要重装系统&am…

Webpack提取页面公共资源

1. 利用html-webpack-externals-plugin 分离基础库 在做React开发时&#xff0c;经常需要引入react和react-dom基础库&#xff0c;这样在打包的时候速度就会比较慢&#xff0c;这种情况下我们可以将这些基础库忽略掉&#xff0c;将它们通过CDN的方式直接引入&#xff0c;而不打…

apache和IIS区别?内网本地服务器项目怎么让外网访问?

Apache和IIS是比较常用的搭建服务器的中间件&#xff0c;它们之间还是有一些区别差异的&#xff0c;下面就详细说说 Apache和IIS有哪些区别&#xff0c;以及如何利用快解析实现内网主机应用让外网访问。 1.安全性 首先说说apache和IIS最基本的区别。Apache运行的操作系统通常为…

Python数学建模问题总结(3)数据可视化Cookbook指南·下

概括总结&#xff1a;五、样式&#xff1a;优化图表、数据可视1.形状&#xff1a;形状的精确程度&#xff1b;2.颜色&#xff1a;区分类别、表示数量、突出特定数据、表示含义&#xff1b;3.线&#xff1a;点划线或不同的不透明度&#xff1b;4.文字排版&#xff1a;应用于图表…

IOC/DI配置管理第三方bean及注解开发。

目录 一、IOC/DI 配置管理第三方bean 1、配置第三方bean 2、加载properties 文件 3、核心容器 二、注解开发 1、注解开发定义bean 2、纯注解开发模式 3、注解开发bean作用范围与生命周期管理 4、注解开发依赖注入 三、IOC/DI注解开发管理第三方bean 1、注解开发管…

深度学习中有哪些从数学模型或相关理论出发, 且真正行之有效的文章?

自深度学习兴起后&#xff0c;深层网路对图像进行特征学习&#xff0c;将低层次的基础特征聚合成更高级的语义特征&#xff0c;取得突出的识别效果&#xff0c;在图像识别、分割及目标检测三大领域得到了众多应用。深度学习算法基本上是由多个网络层搭建&#xff0c;每个网络层…

SpringBoot自动装配

前言 Spring翻译为中文是“春天”&#xff0c;的确&#xff0c;在某段时间内&#xff0c;它给Java开发人员带来过春天&#xff0c;但是随着我们项目规模的扩大&#xff0c;Spring需要配置的地方就越来越多&#xff0c;夸张点说&#xff0c;“配置两小时&#xff0c;Coding五分…