C++:模板(函数模板,类模板)

目录

泛型编程

函数模板

函数模板格式

函数模板的原理

函数模板的实例化

类模板

类模板格式

类模板实例化


模板分为函数模板和类模板

在C++中使用模板可以让我们实现泛型编程

泛型编程

如果我们需要实现一个加法add函数,那么会怎么实现呢?

int Add(int a, int b)
{return a + b;
}

 上面就是一种实现方法

但是它有严重的缺点,就是它的返回值和形参都是固定的,都是整型

如果我们还要写浮点型,那么我们还得多写一个函数

int Add(int a, int b)
{return a + b;
}double Add(double a, double b)
{return a + b;
}

但是在C++中我们有模板,我们可以理解为这个Add函数就是模具,我们给它什么材料它就是什么材料 

所以如果是C++我们可以这样写

template<class T>
T Add(T a, T b)
{return a + b;
}

这就是函数模板 

函数模板

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

函数模板格式

上面的加法的模板就是一种简单的格式

template<class T>
T Add(T a, T b)
{return a + b;
}

首先要有template这个关键字, 后面跟上<>里面的class也是一个关键字,T就是一个类似于类型的东西,我们实例化出来的其他内置类型最后就会把这个T替换掉

这是比较常用的一种写法

当然我们也可以把class换成typename

template<typename T>
T Add(T a, T b)
{return a + b;
}

这两种写法效果都一样

也可以写多个模板

template<class T1, class T2, ..., class Tn>
void Add(T1 a, T2 b, ..., Tn n)
{//...
}

函数模板的原理

在编译的时候,如果我们在一个main函数里既写了整型的Add又写了浮点型的Add,那么这是两个函数还是一个函数呢?

答案是两个函数

相当于编译器帮我们写了两个函数,只是单纯的把模板T给推演成了其他的内置类型,如下图

 所以模板就相当于编译器帮我们做了我们原本要做的事情

当然了上面的Add函数其实写的都不是很好,我们不改变a和b的话可以加上const修饰,还可以加上引用减少拷贝,提高效率

template<class T>
T Add(const T& a, const T& b)
{return a + b;
}

函数模板的实例化

如果类型不匹配是会报错的 

template<class T>
T Add(const T& a, const T& b)
{return a + b;
}int main()
{int a = 10;double d = 10.0;Add(a, d);return 0;
}

 

这里就是因为a和d的类型不一致导致报错

编译器识别出a是int类型,到模板里那个T就是int,但是后面的d是double,跟int匹配不上,所以自然就报错了 

解决方案 

template<class T>
T Add(const T& a, const T& b)
{return a + b;
}int main()
{int a = 10;double d = 10.0;Add(a, (int)d);return 0;
}

可以像上面把d强转成int类型即可 

template<class T>
T Add(const T& a, const T& b)
{return a + b;
}int main()
{int a = 10;double d = 10.0;Add((double)a, d);return 0;
}

或者是把a强转成double类型

template<class T>
T Add(const T& a, const T& b)
{return a + b;
}int main()
{int a = 10;double d = 10.0;Add<int>(a, d);return 0;
}

也可以在函数名后面加上<类型>,相当于是告诉了编译器我要实例化一个int类型的Add,这样即使d的类型不匹配,进入函数后也会隐式类型转换成int

template<class T>
T Add(const T& a, const T& b)
{return a + b;
}int main()
{int a = 10;double d = 10.0;Add<double>(a, d);return 0;
}

当然double也没问题,和前面的int原理一致  

类模板

之所以叫类模板就是在类中使用模板,

类模板格式

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

也就是在一个类中,我们可以使用多个类型

template<class T>
class Stack
{
public:Stack(size_t capacity = 4){_array = new T[capacity];_capacity = capacity;_size = 0;}void Push(const T& data);
private:T* _array;size_t _capacity;size_t _size;
};

也就是说,例如我们写一个栈, 写了一个栈的模板出来,就相当于把所有内置类型的栈都写了出来,我们在函数内部想定义什么类型的栈就定义什么类型的栈,这是C语言办不到的

int main()
{Stack<int> st1;Stack<double> st2;return 0;
}

类模板实例化

上面的代码就是一个实例化

我们实例化出了一个int类型的栈和double类型的栈

因为我们使用一个类的时候不像函数一样可以传参从而让编译器缺定我们模板的类型是什么

所以我们在实例化一个类的时候需要加上<类型>来让编译器知道我们需要什么类型的模板,从而给我们实例化出来,就像上面函数模板中的a和d一样


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

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

相关文章

python 闭包、装饰器

一、闭包&#xff1a; 1. 外部函数嵌套内部函数 2. 外部函数返回内部函数 3.内部函数可以访问外部函数局部变量 闭包&#xff08;Closure&#xff09;是指在一个函数内部定义的函数&#xff0c;并且内部函数可以访问外部函数的局部变量&#xff0c;即使外部函数已经执行…

Python Formulas模型以JSON格式文件导出导入

1. 导入formulas和json包 在加载模型之前&#xff0c;导入formulas和json包。 import formulas, json2. 加载Excel模型 加载一个公式复杂的Excel模型&#xff0c;该模型耗时较长&#xff0c;我们可以观察使用json格式是否能更高效。 xl_model formulas.ExcelModel().load(…

oracle 基础知识表的主键

一、表的约束条件 •约束条件是施加在表的字段上的一组限制条件&#xff0c;它使得只有符合限制条件要求的数据才能输入表。 •保证了表中的数据的正确性 i.约束条件包括了&#xff1a;非空和唯一和核对&#xff0c;即not null 和unique 和check null的含义:不确定 3个人去捡苹…

重磅 - Github 上免费大屏来啦,教你快速搭建积木报表

先看看大屏效果 JimuReport积木报表的集成版本&#xff0c;已经提供了免费数据可视化设计工具。 支持丰富的数据源连接&#xff0c;能够通过拖拉拽方式快速制作图表和门户设计&#xff1b;目前支持多种图表类型&#xff1a;柱形图、折线图、散点图、饼图、环形图、面积图、漏斗…

Java基础巩固 -- 面向对象

Java基础巩固 – 面向对象 简介&#xff1a;博主本人由于在毕业前忙于找工作&#xff0c;因此选择了Java后端开发&#xff0c;但学习过程比较碎片化&#xff0c;并没有进行系统性学习。本章博客将会系统性重温Java的一些基础知识和概念。 1.面向对象 1.1 概念 面向对象是一…

微服务概念篇-服务提供者/服务消费者

微服务概念篇-服务提供者/服务消费者 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、服务提供者是什么&#xff1f; 提供接口给其他微服务进行调用的服务称之为服务提供者 二、服务消费者是什么? 调用其他服务的接口的服务称之为服务消费者 三…

学习网络系统的心得体会

网络系统 零拷贝 磁盘是计算机系统中读写速度最慢的的硬件之一&#xff0c;而零拷贝技术是用于提高文件传输性能的&#xff0c;通过减少上下文切换次数与数据拷贝的次数从而提高传输性能。 操作系统中IO的流程 大体流程 收到IO请求由用户态切换到内核态&#xff0c;CPU发送…

【vueUse库Time模块各函数简介及使用方法--全篇】

vueUse库是一个专门为Vue打造的工具库,提供了丰富的功能,包括监听页面元素的各种行为以及调用浏览器提供的各种能力等。其中的Browser模块包含了一些实用的函数,以下是这些函数的简介和使用方法: vueUse库Sensors模块各函数简介及使用方法 vueUseTime函数1. useDateFormat…

# Redis 入门到精通(七)-- redis 删除策略

Redis 入门到精通&#xff08;七&#xff09;-- redis 删除策略 一、redis 删除策略–过期数据的概念 1、Redis 中的数据特征 Redis 是一种内存级数据库&#xff0c;所有数据均存放在内存中&#xff0c;内存中的数据可以通过TTL指令获取其状态。 XX &#xff1a;具有时效性…

Linux下git入门操作

0.创建仓库 可以按这个配置来&#xff0c;.gitignore中存放了上传时忽略的文件类型后缀。 1.clone仓库 在gitee上创建好仓库&#xff0c;点击克隆/下载&#xff0c; 复制地址fyehong/Linux_notes 。 在所需的文件夹中放置仓库。比如我在文件夹lesson9下存储仓库。就在less…

C# 与C++ cli

cli CLI&#xff08;Command Line Interface&#xff09;是一种通过命令行界面与计算机系统进行交互的方式。它提供了一种以文本形式输入命令和接收系统输出的方法&#xff0c;用于执行各种操作和管理计算机系统。以下是CLI的详细解释&#xff1a; 一、定义与基本概念 定义&…

Linux系统下的DevOps工具链:从CI到CD

Linux系统下的DevOps工具链覆盖了从持续集成&#xff08;CI&#xff09;到持续部署&#xff08;CD&#xff09;的全过程&#xff0c;以下是关键环节及其常用工具&#xff1a; 1.版本控制 (SCM) •Git: 管理代码版本&#xff0c;分支合并&#xff0c;是DevOps流程的基础。 2.…

Android中Intent和IntentFilter

目录 一 概述二 使用2.1 显式调用2.2 隐式调用2.3 IntentFilter三个属性2.3.1 action2.3.2 catagory2.3.3 data 一 概述 intent是意图&#xff0c;intentFilter是意图过滤器。使用intent&#xff0c;可以启动activity、service、broadcastReceiver等。 二 使用 2.1 显式调用…

jenkins面试题全集

1. 简述什么是Jenkins &#xff1f; Jenkins是一个开源的持续集成的服务器&#xff0c;Jenkins开源帮助我们自动构建各类项目。 Jenkins强大的插件式&#xff0c;使得Jenkins可以集成很多软件&#xff0c;可以帮助我们持续集成我们的工程项目&#xff0c;对于我们测试来说&…

机车 - 凯旋(Triumph)Street Triple 765系列的R版和RS版的区别

凯旋&#xff08;Triumph&#xff09;Street Triple 765系列的R版和RS版有一些显著的差异&#xff0c;主要体现在性能、配置和价格方面。选择哪一个版本取决于你的骑行需求、预算和骑行经验。以下是两者的主要区别和一些建议&#xff1a; 差异点 1. 性能&#xff1a; * 发动机…

AI学习指南机器学习篇-t-SNE的优缺点

AI学习指南机器学习篇-t-SNE的优缺点 在机器学习领域&#xff0c;t-SNE&#xff08;t-Distributed Stochastic Neighbor Embedding&#xff09;是一种非常强大且流行的降维算法。它被广泛应用于数据可视化、特征提取等任务中。然而&#xff0c;与其他算法一样&#xff0c;t-SN…

Python酷库之旅-第三方库Pandas(041)

目录 一、用法精讲 136、pandas.Series.ne方法 136-1、语法 136-2、参数 136-3、功能 136-4、返回值 136-5、说明 136-6、用法 136-6-1、数据准备 136-6-2、代码示例 136-6-3、结果输出 137、pandas.Series.eq方法 137-1、语法 137-2、参数 137-3、功能 137-4、…

医疗信息化之PACS系统源码,C#医学影像系统源码,成熟在用稳定运中

C#语言开发的一套PACS系统源码&#xff0c;C/S架构&#xff0c;成熟稳定&#xff0c;多家大型综合医院应用案例。自主版权&#xff0c;支持二次开发&#xff0c;授权后可商用。 医学影像存储与传输系统是针对数据库存储、传输服务、图像处理进行了优化,存储更安全、传输更稳定、…

Ethernet/IP转CC-Link IEFB协议转化网关(通讯解决方案)

怎么样把Ethernet/IP和CC-Link IEFB网络通讯连接起来呢?最近有很多朋友咨询这个问题&#xff0c;在这里统一为大家详细说明一下。其实有一个设备可以很轻松地解决这个问题&#xff0c;名为YC-EIP-TCP&#xff0c;下面是详细信息。 一&#xff0c;设备主要功能 1、YC-EIP-CCL…

ios 15-16手机绕过ssl验证(抓取app上的https包)

绕过ssl验证的基本流程 前提概要&#xff1a;为什么你的charles抓不了https包 ios 越狱ios rootful安装ios 越狱商店sileo安装substitute越狱商店安装SSL Kill Switch3 全流程坑点巨多&#xff0c;博主亲身踩坑&#xff0c;务必按着步骤来 准备工作 type b to c 的数据线苹果…