C++ 泛型编程篇(一) 模板初阶

目录

〇、为什么需要模板?

一、函数模板

1. 函数模板概念

2. 函数模板格式

3. 函数模板的原理 

4. 隐式实例化和显示实例化

5. 无法推导模板类型的情况

a.  只设置一个模板,但两个不同的参数类型使用模板

b. 函数体中使用了模板

6. 同名普通函数和模板函数的优先级问题 

二、类模板

1. 为什么?

2. 是什么?

3. 怎么用

4. 模板不支持分离编译

5. 模板也支持缺省参数


〇、为什么需要模板?

        如何实现一个所有类型可用的交换函数呢?函数重载的出现仅仅是解决了命名问题,但我们还是要为每种类型的变量都写一个同名函数,还是有点麻烦。能不能把参数的类型设置为一个变量?然后在使用函数时同时传入参数类型和实参,这样无论有多少种类型的参数,我们都只需要写一个这样的模板函数。


”把参数类型设置为变量“。基于这样的思想,c++引入了模板:将参数类型设置为变量,从而可以创建能够处理多种数据类型的代码。这也是泛型编程的一个关键特性,使得代码更加灵活和可重用。


泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。(通俗的说,泛型编程中泛型的意思就是适用于所有类型。)


一、函数模板

1. 函数模板概念

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

2. 函数模板格式

template<typename T1, typename T2,......,typename Tn>

返回值类型 函数名(参数列表){}

注意:typename是用来定义模板参数关键字也可以使用class(切记:不能使用struct代替class)函数模板就是用设置的模板替换了形参的具体类型。


eg. 甚至可以一个typename, class. 


 每一个使用模板的函数或类都必须在函数声明的上一行写上模板。

3. 函数模板的原理 

模板的原理是编译器会自动帮我们推导参数和生成函数。

注,模板和auto不同,auto不能用于形参。


模板参数推演(将参数的类型替换为目标类型):

        在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此:

4. 隐式实例化和显示实例化

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

  • 隐式实例化:让编译器根据实参推演模板参数的实际类型
  • 显式实例化:在函数名后的<>中指定模板参数的实际类

5. 无法推导模板类型的情况

a.  只设置一个模板,但两个不同的参数类型使用模板

在了解概念前先看以下例子: 

eg. 只设置一个模板,但两个不同的参数类型使用模板,让编译器无法推导出模板的类型。

 


解决方法一:使用显示实例化(直接告诉编译器模板是什么类型,不用推导)


解决方法二:将其中一个数值的类型强制转换,编译器自动推导模板类型,还是隐式实例化。


解决方法三:设置两个模板

但要注意,这里的返回值的类型用模板是T1,和第一个形参的类型相同,还要注意返回值错误。

b. 函数体中使用了模板

 


解决方法:使用显示实例化


6. 同名普通函数和模板函数的优先级问题 

        情况一:如果有参数类型符合,且未使用模板的函数A 和 使用模板的函数B 同时存在,优先使用函数A,在A的类型不匹配的情况下,编译器才会使用B。

         情况二:使用了两个同一模板参数的函数和使用了两个不同模板参数的函数同时存在时,优先调用使用了两个同一模板参数的函数,如果传入的两个参数类型不同,才会调用使用了两个不同模板参数的函数。


二、类模板

1. 为什么?

以以下代码为例:

        虽然我们可以使用typedef将成员类型分离出来,方便我们修改成员变量的类型,但是一旦我们需要定义两个成员类型不同的对象时,typedef就无可奈何了:

2. 是什么?

        是对一众只有成员数据类型不同的类的抽象。它使类中的成员函数和数据成员可以取任意的数据类型。

3. 怎么用

定义类模板:

template<class T>
class Stack{};

使用类模板必须显示实例化:

Stack<int> st;

        以上例子中Stack不是一个类,只有往模板形参里传入一个类型才是一个类,如:Stack<int>。所以传入不同的类型生成的是不同的类。


4. 模板不支持分离编译

模板不支持分离编译,即不支持声明和定义放在不同文件中


但支持在同一文件中,将模板的类的成员函数的声明和定义分离定义:

作用加上域作用限定符才能让定义找到声明。


模板不支持定义和声明分离在不同文件中,所以直接将使用了模板的函数的声明和定义一起写在头文件下就好了。

5. 模板也支持缺省参数

模板也支持缺省参数,不过模板缺省的是类型。

即便缺省了,在使用模板类时,依旧要加上< >


------------------------END-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

字符串型漏洞注入

SQL注入是一种严重的安全漏洞&#xff0c;它允许攻击者在不受控制的情况下执行任意的SQL代码。这种攻击通常发生在Web应用程序没有正确验证或转义用户输入的情况下。字符串型注入是SQL注入的一种形式&#xff0c;它涉及到在应用程序的输入框中插入恶意的字符串&#xff0c;以干…

K8S--常用的命令

原文网址&#xff1a;K8S--常用的命令-CSDN博客 简介 本文介绍K8S常用的命令。 官网 简略用法&#xff1a;https://kubernetes.io/zh-cn/docs/reference/kubectl/ 详细用法&#xff08;有示例&#xff09;&#xff1a;https://kubernetes.io/docs/reference/generated/kub…

MINIO安装的方法(WindowsLiunx)

2 minio安装教程 注&#xff1a;官方中文文档&#xff1a;MinIO对象存储 Windows — MinIO中文文档 | MinIO Windows中文文档 Liunx 安装方&#xff1a;MinIO对象存储 Linux — MinIO中文文档 | MinIO Linux中文文档 2.1 下载地址 https://dl.min.io/server/minio/…

Quarto Dashboards 教程 1:Overview

「写在前面」 学习一个软件最好的方法就是啃它的官方文档。本着自己学习、分享他人的态度&#xff0c;分享官方文档的中文教程。软件可能随时更新&#xff0c;建议配合官方文档一起阅读。推荐先按顺序阅读往期内容&#xff1a; 1.quarto 教程 1&#xff1a;Hello, Quarto 2.qu…

基于python+django+mysql农业生产可视化系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

Tiny11作者开源:利用微软官方镜像制作独属于你的Tiny11镜像

微软对Windows 11的最低硬件要求包括至少4GB的内存、双核处理器和64GB的SSD存储。然而&#xff0c;这些基本要求仅仅能保证用户启动和运行系统&#xff0c;而非流畅使用 为了提升体验&#xff0c;不少用户选择通过精简系统来减轻硬件负担&#xff0c;我们熟知的Tiny11便是其中…

【linux】Linux第一个小程序-进度条

1. 预备知识&#xff1a;回车和换行 回车&#xff08;Carriage Return&#xff0c;CR&#xff09;&#xff1a; 在早期的机械打字机中&#xff0c;回车指的是将打字机的打印头移回到行首的操作&#xff0c;这样打印头就可以开始新的一行的打印。在ASCII编码中&#xff0c;回车用…

【VueUse】重新定义状态管理在 Vue 中的体验

在 Vue 生态系统中&#xff0c;状态管理一直是开发者们关注的焦点之一。而随着 VueUse 的出现&#xff0c;我们迎来了一种全新的方式来处理状态管理&#xff0c;它让我们能够以更简单、更灵活的方式来管理应用程序的状态。 在本文中我们将深入探讨 VueUse 中与状态管理相关的内…

第一篇【传奇开心果系列】Python深度学习库技术点案例示例:深度解读深度学习在自动驾驶领域的应用

传奇开心果博文系列 系列博文目录Python深度学习库技术点案例示例系列 博文目录前言一、深度学习在自动驾驶方面的应用介绍二、目标检测和识别示例代码三、路况感知示例代码四、行为预测示例代码五、路径规划示例代码六、自动驾驶控制示例代码七、感知融合示例代码八、高精度地…

基于Springboot的点餐平台

基于SpringbootVue的点餐平台的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页展示 菜品信息 菜品资讯 购物车 后台登录 用户管理 菜品分类管理 菜品信息管理 …

npm、yarn与pnpm详解

&#x1f525; npm、yarn与pnpm详解 &#x1f516; 一、npm &#x1f50d; 简介&#xff1a; npm是随Node.js一起安装的官方包管理工具&#xff0c;它为开发者搭建了一个庞大的资源库&#xff0c;允许他们在这个平台上搜索、安装和管理项目所必需的各种代码库或模块。 &#…

【网页在线小游戏源码】

网页在线小游戏源码 效果图部分源码领取源码下期更新预报 效果图 部分源码 index.html <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <meta id"viewport" na…

零代码编程:下载的PDF文件自动批量重命名

从arxiv或者一些其他网站下载的PDF文件&#xff0c;标题只是创建时间&#xff0c;看不出里面内容是什么&#xff0c;要一个个打开看非常麻烦。 可以在GPT4中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写关于重命名PDF文件的Python脚本的任务&…

Llama-7b-Chinese本地推理

Llama-7b-Chinese 本地推理 基础环境信息&#xff08;wsl2安装Ubuntu22.04 miniconda&#xff09; 使用miniconda搭建环境 (base) :~$ conda create --name Llama-7b-Chinese python3.10 Channels:- defaults Platform: linux-64 Collecting package metadata (repodata.js…

机器学习和深度学习-- 李宏毅(笔记与个人理解)Day22

Day 22 Transformer seqence to seqence 有什么用呢&#xff1f; Encoder how Block work 仔细讲讲Residual 的过程&#xff1f; 重构 Decoder - AutoRegressive Mask 由于是文字接龙&#xff0c;所以无法考虑右边的 info 另一种decoder Encoder to Decoder – Cross Attend…

❤mac使用Idea工具

❤mac使用Idea工具 1、安装 直接跳过&#xff0c;文章有 &#xff08;点击跳转&#xff09; 给自己的mac系统上安装java环境 2、使用 快捷键 Command , 系统首选项 设置Idea连接数据库 打开右侧的database&#xff08;或菜单里&#xff09;连接数据库&#xff0c;根据提…

opencv绘制线段------c++

绘制线段 bool opencvTool::drawLines(std::string image_p, std::vector<cv::Point> points) {cv::Mat ima cv::imread(image_p.c_str()); // 读取图像&#xff0c;替换为你的图片路径 cv::Scalar red cv::Scalar(0, 0, 255); // Red color int thickness 2;// 遍…

Vue3 超前版发布,全面拥抱 JSX/TSX

拥抱 JSX/TSX? 我们都知道 Vue 一直主流是使用 template 模板来进行页面的编写。而就在最近,Vue3 的超前项目 Vue Macros 中,发布了 defineRender、setupComponent、setupSFC 这些新的 API,这代表了,以后 Vue3 有可能可以全面拥抱 JSX/TSX 了!! 说这个新 API 之前,我…

2024江苏省考申论新说刷题系统班

2024江苏省考申论新说刷题系统班&#xff0c;针对江苏省考特色&#xff0c;精准指导考生刷题备考。课程系统全面&#xff0c;深入剖析申论题型&#xff0c;提供实战演练机会。通过科学刷题&#xff0c;考生能迅速提升申论能力&#xff0c;为江苏省考成功上岸打下坚实基础。 下…

LangChain的核心模块和实战

主要模型 LLM:对话模型, 输入和输出都是文本Chat Model: 输入输出都是数据结构 模型IO设计 Format: 将提示词模版格式化Predict: langchain就是通过predict的方式调用不同的模型, 两个模型的区别不大, Chat Model 是以LLM为基础的.Parese: langchain还可以对结果进行干预, 得…