模板初阶.

模板初阶

泛型编程: 编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础

初阶模板:

  • 函数模板

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型生成函数的特定版本。

语法: template<typename/class 参数T1, typename/class 参数T2, …>

返回值类型  函数名( 参数 形参 ,…)   // T1和T2当作类型用就可以了,返回值类{                                      型也可以是参数

              …

        }

函数模板的实例化:根据函数模板和调用类型 编译器自动生成的函数 称为模板的实例化

参数的类型是根据传入的实参的类型进行推演得到的

Eg

看似调用的是void Swap(T& left , T& right);

其底层实际上调用的是编译器用模板生成的函数(这称为模板的实例化)。

实际上C++库中有swap函数,其实现也是通过模板。

当left和right的类型不同时, 那么返回的时候,T就不清楚返回那种类型因此报错。

解决方法:

  1. 传参时对参数进行强转
  2. 显式实例化: 不再推演参数

函数名< 类型 > (函数调用传入的参数)

模板参数 就是 此处<类型>中的 类型

  1. 模板设置两个参数,并且Auto 做模板函数的返回值

当函数的形参固定了,那么T就无法推演了,因此这种情况的解决方法也是 对函数模板进行实例化。 即通过: func<int>(m); 类型的调用

当有最匹配的函数,那么就调用最匹配的函数。

如果没有最匹配的函数,那么就调用能生成最匹配的函数的模板函数

Eg

Add( a , b);

a , b 如果都是int类型, 那么调用的是 int Add(int left , int right);

a , b 如果是并不是都是 int 类型 , 那么调用的是 此处的模板函数, 即通用加法函数

二. 类模板:

类模板使用必须实例化

语法:

Template < typename/class 参数T1 , … >

Class  自定义类名

{

       …

}

Eg:

参数是通过实例化指定的。

st1存储int数据的 Stack类 ,st2 存储 double 类数据的 Stack类。

st1的类型是 Stack<int> , st2的类型是Stack<double> 。即st1和st2是两种不同的类型

类模板的成员函数的声明和定义分离:

语法:

Template <typename/class 参数1 , typename/class 参数2 ,…>

返回值类型  类名<参数1,…> : : 函数名(形参)

{

       …

}

注意: 类模板的成员函数的声明和定义分离只能在本文件中进行,不能声明在.h文件,定义在.cpp文件,会导致链接错误。 因此不建议类模板的成员函数的声明和定义分离到了两个文件

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

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

相关文章

《大话数据结构》10 树

1. 二叉树遍历算法 1.1 前序遍历算法 二叉树的定义是用递归的方式&#xff0c;所以&#xff0c;实现遍历算法也可以采用递归&#xff0c;而且极其简洁明了。先来看看二叉树的前序遍历算法。代码如下&#xff1a; 假设我们现在有如下图这样一棵二叉树T。这树已经用二叉链表结构…

分类神经网络1:VGGNet模型复现

目录 分类网络的常见形式 VGG网络架构 VGG网络部分实现代码 分类网络的常见形式 常见的分类网络通常由特征提取部分和分类部分组成。 特征提取部分实质就是各种神经网络&#xff0c;如VGG、ResNet、DenseNet、MobileNet等。其负责捕获数据的有用信息&#xff0c;一般是通过…

第一届 _帕鲁杯_ - CTF挑战赛

Mis 签到 题目附件&#xff1a; 27880 30693 25915 21892 38450 23454 39564 23460 21457 36865 112 108 98 99 116 102 33719 21462 21069 27573 102 108 97 103 20851 27880 79 110 101 45 70 111 120 23433 20840 22242 38431 22238 22797 112 108 98 99 116 102 33719 2…

【已解决】电脑设置notepad++默认打开txt

1、以管理员的方式打开notepad 步骤&#xff1a;打开设置 -> 首选项 -> 文件关联 2、 设置Notepad默认打开 按照以下步骤将Notepad设置为默认打开.txt文件&#xff1a; 右键单击任何一个.txt文件。选择“属性”。在“常规”选项卡中&#xff0c;找到“打开方式”&#…

STM32F1之I2C通信

目录 1. 简介 2. 硬件电路 3. IIC时序基本单元 3.1 发送一个字节 3.2 接收一个字节 3.3 发送应答 3.4 接收应答 1. 简介 I2C&#xff08;Inter-Integrated Circuit&#xff09;总线是由NXP Semiconductors&#xff08;前身为Philips Semiconductor&#xff09;…

Tomcat弱口令及war包漏洞复现(保姆级教程)

1.环境搭建 靶机&#xff1a;Ubuntu 安装参考&#xff1a;安装Ubuntu详细教程_乌班图安装教程-CSDN博客 vulhub docker搭建tomcat漏洞环境 参考&#xff1a;vulhub docker靶场搭建-CSDN博客 工具&#xff1a;burpsuite 2.漏洞复现 2.1弱口令爆破 进入http://192.168.143…

vscode 配置verilog环境

一、常用的设置 1、语言设置 安装如下插件&#xff0c;然后在config 2、编码格式设置 解决中文注释乱码问题。vivado 默认是这个格式&#xff0c;这里也设置一样。 ctrl shift p 打开设置项 3、插件信任区设 打开一个verilog 文件&#xff0c;显示是纯本文&#xff0c;没…

在centos系统中使用boost库

打开MobaXterm软件 下载 boost_1_85_0.tar.gz tar -zxvf boost_1_85_0.tar.gz解压缩成boost_1_85_0文件夹 双击arrayDemo.cpp 在里面可以编写代码 arrayDemo.cpp #include <boost/timer/timer.hpp> #include <boost/array.hpp> #include <cmath> #inc…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《风电租赁储能参与电能-调频市场竞价策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Vue3+TS版本Uniapp:封装uni.request请求配置

作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者✍/CSDN百万访问博主/B站千粉前端up主 封装请求配置项 封装拦截器封装uni.request 封装拦截器 uniapp的封装逻辑不同于Vue3项目中直接使用axios.create()方法创建实例&#xff08;在create方法中写入请求…

[Algorithm][二分查找][在排序数组中查找元素的第一个和最后一个位置][x 的平方根]详细讲解

目录 1.在排序数组中查找元素的第一个和最后一个位置1.题目链接2.算法原理详解1.查找区间左端点2.查找区间右端点 3.代码实现 2.x 的平方根1.题目链接2.算法原理详解3.代码实现 1.在排序数组中查找元素的第一个和最后一个位置 1.题目链接 在排序数组中查找元素的第一个和最后…

Rust序列化和反序列化

Rust 编写python 模块 必备库 docker 启动 nginx 服务 NGINX 反向代理配置