【C++】模板、宏、命名空间、

news2024/11/16 15:58:28

十五、C++中的模板templates

本部分讨论C++中的模板templates
在别的语言中,比如java、c、c#等托管语言中,模板类似泛型的概念,但模板比泛型要强大得多。模板有点像宏,而泛型却非常受限于类型系统以及其他很多因素。同时模板也是一个巨大的、复杂的话题,本部分仅仅是浅浅的入门。

1、什么是模板
模板就是基于你给定的一套规则让编译器为你写代码。或者通俗的说就是,你写个模板,里面抠出一些空,这些空填上不同的东西,就是一个可用的对象。或者我举个例子,比如开发票,其实发票的格式都是一样的,只有抬头、金额、数量等几个要素不一样。你把空发票就可以看出模板,里面的抬头、金额、数量等几个地方是空的,你只要根据不同的客户填上不同的信息,每个客户的发票就开好了。通俗的理解,模板就是那个空发票。你把要填的信息填到对应的空里面,就你生成一张特定客户的发票了。
所以模板就是把代码的某些部分挖掉,然后传给编译器挖掉部分要填的内容,编译器就帮你完成这段代码了。所以说模板就是你给编译器一个套路,然后再给要填的空的答案,编译器就自动帮你完成了。

2、为什么要用模板

如上左图所示,我只是想写一个func函数,但是我得要允许func函数可以接受各种类型的参数,比如整型、字符串、浮点型等等,那此时我就得写好几个函数重载,如上图A处。而且这些重载函数除了参数类型不一样外,其他地方都一模一样。手动重复写A处这么多差别不大的函数太费劲。如果我写一个模板,其他都写全,就把参数类型空出来,然后我给编译器传入那个空的答案,编译器像填空一样帮我填上就行了。这样我就省力很多了。这就是template诞生的初衷。

说明:cout是可以接受任何基本类型的或者说C++内置类型,就是我们现在正在使用的这些类型。

3、template的语法
上右图B处是template的语法:template单词就表示你定义了一个模板;尖括号里面的typename是模板的参数;T是名字,你可以随便取。
T用在C处。也就是T可以在整个模板代码中使用,来代替任何出现类型的地方。比如如果代码中出现int value,我们就可以写成T value;再比如如果出现string value,我们也可以写成T value。

当你定义了一个模板后(B处),编译器就会在编译期评估这个模板。所以上右图B、C处的代码不是真正的代码,func函数也不是一个真正的函数,它只是模板的一部分。只有当我们实际调用它的时候(D处),func函数才被真正的创建,创建时也是根据我们传入的参数类型,T才被替换,func才被创建出来,并作为源代码的一部分进行编译的。所以,比如MSVC编译器就不会对你不使用的模板错误进行报错,但是比如Clang等一些编译器会报错。

4、模板的工作原理

当我们调用func("hello")时,模板的另一个版本的函数就会被编译器创造(把尖括号中的类型替换T),并复制到模板下面,然后才编译。
所以模板的工作原理就是,当你调用模板中的函数时,编译器就根据你给它的信息,把该填的空都对应填上,并将生成的代码复制到模板后面即可。

模板不仅可以让编译器帮我们写函数,还可以写类。事实上,大量的C++标准模板库同样完全使用了模板,下面我们再展示如何写类的模板:

上面右图我们创造数组的方式,和C++标准模板库创造array数组的方式一样。记不记得array数组也是让我们在尖括号里面提供两个参数,一个是数组的类型,一个是数组的长度。所以模板有点像C++的meta programming(元编程),就是编译器在编译时实际还进行了编程。

了解模板模板的工作原理后,我们自然可以判断,不是什么情况都适合使用模板的,有的个性化非常强的工作,你就还是别使用模板了。如果是一些重复性很强的工作,比如日志系统,比如要写很多类型的重载函数,这样的工作使用模板就是非常合适的。

十六、C++中的宏

待续。。。。。

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

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

相关文章

SQLite数据库管理:深入解析创建数据库、表、索引及用户权限与事务管理

目录 一、SQLite数据库创建 1.1 安装SQLite 1.2 创建数据库 1.3 验证数据库 二、创建表 2.1 基本语法 2.2 数据类型 2.3 创建表的示例 2.4 查看表结构 三、创建索引 3.1 创建索引的语法 3.2 创建索引的示例 3.3 索引的维护 四、管理用户权限 4.1 基于文件系统的权…

动态规划算法:12.简单多状态 dp 问题_打家劫舍_C++

目录 题目链接:LCR 089. 打家劫舍 - 力扣(LeetCode) 一、题目解析 题目: 解析: 二、算法原理 1、状态表示 状态表示: 2、状态转移方程 状态转移方程推理: 3、初始化 dp表初始化: 特殊…

C++(学习)2024.9.25

目录 继承 概念 构造函数 1.派生类与基类构造函数的关系 2.解决方案 (1)补充基类的无参构造函数 (2)手动在派生类中调用基类构造函数 1.透传构造 2.委托构造 3.继承构造 3.对象的创建与销毁流程 4.多重继承 (1)概念 …

基于Spring Boot+Vue前后端分离的中医药科普系统设计和实现(协同过滤算法)【原创】

🎈系统亮点:协同过滤算法; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构:B/S架构 运行环境:win10/win11、jdk17 前端: 技术:框架Vue.js&am…

利用Langchain开发框架研发智能体Agent的过程,以及相关应用场景

大家好,我是微学AI,今天给大家介绍一下本文主要介绍了利用langchain开发智能体agent的过程。文章首先阐述了项目背景,随后通过给出样例代码,详细展示了执行过程。此外,本文还探讨了该智能体agent在实际应用场景中的运用…

【漏洞复现】灵当CRM multipleUpload.php接口处存在文件上传漏洞

》》》产品描述《《《 灵当CRM致力于为企业提供客户管理数字化、销售管理自动化、服务管理智能化、项目管理一体化的个性化CRM行业解决方案,构建全生命周期的数字化管理体系,实现可持续的业绩增长! 》》》漏洞描述《《《 灵当CRM系统接口multipleUpload.php文件上传漏洞&#x…

认知战认知作战:认知战战略如何玩转东方文化

认知战认知作战:认知战战略如何玩转东方文化 认知战认知作战:认知战战略如何玩转东方文化 关键词:认知战, 东方文化, 精髓元素, 美学引领, 生活方式连接, 战略故事, 艺术融合, 文化符号, 哲学思想, 古建筑灵感, 传统图案, 限量魅力, 沉浸式…

【JAVA开源】基于Vue和SpringBoot的学科竞赛管理系统

本文项目编号 T 047 ,文末自助获取源码 \color{red}{T047,文末自助获取源码} T047,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

小学生管理系统项目

在当今数字化教育的背景下,小学生管理系统应运而生。本项目采用 JSP Servlet JDBC MySQL 的技术组合,并在开发工具 Idea 和 Eclipse 的辅助下,结合数据库管理工具 Navicat 进行开发。 一、系统入口 用户登录入口:为普通用户提…

树上差分详解

零、前言 关于差分: 差分数组详解,一维二维差分-CSDN博客 关于LCA: LCA算法-倍增算法_lca倍增算法-CSDN博客 LCA算法-Tarjan算法_lca数组-CSDN博客 树链剖分——重链剖分,原理剖析,代码详解-CSDN博客 一、树上差…

Docker全家桶:从0到加载本地项目

安装docker,我们选择的是CentenOS 7。 目录 Docker安装 命令 命令别名 数据卷挂载 Dockerfile 容器网络互联 Docker安装 1. 先删除本机旧的或者残留的docker sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest …

Android13 展锐平台拨号中视频彩铃界面方向未与设备方向一致

背景:拨号中视频彩铃界面方向未与设备方向一致,要求视频彩铃界面方向与设备方向一致,修改视频彩铃显示的地方; 如图所示: 修改: packages/services/Telecomm/src/com/android/server/telecom/VideoProvid…

【GUI设计】基于Matlab的图像特征提取GUI系统(9),matlab实现

博主简介:如需获取设计的完整源代码或者有matlab图像代码项目需求,可联系主页简介提供的方式或者文末的扫码。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于Matlab的图像特征提取GUI系统(9&a…

得物App荣获国家级奖项,正品保障引领潮流电商新风尚

近日,在2024年中国国际服务贸易交易会上,得物App凭借其在科技创新保障品质消费领域的突出成果,再次荣获国家级殊荣——“科技创新服务示范案例”。这是继上海市质量金奖之后,得物App获得的又一个“高含金量”奖项。 作为深受年轻人…

YOLOv8改进 - 注意力篇 - 引入(A2-Nets)Double Attention Networks注意力机制

一、本文介绍 作为入门性篇章,这里介绍了A2-Nets网络注意力在YOLOv8中的使用。包含A2-Nets原理分析,A2-Nets的代码、A2-Nets的使用方法、以及添加以后的yaml文件及运行记录。 二、A2-Nets原理分析 A2-Nets官方论文地址:A2-Nets文章 A2-Net…

美妆电商与AI知识库:构建智能化购物体验

在当今这个数字化时代,美妆电商行业正经历着前所未有的变革。随着人工智能(AI)技术的飞速发展,AI知识库在美妆电商领域的应用日益广泛,不仅重塑了传统的购物模式,还为消费者带来了前所未有的智能化购物体验…

手把手教你找到海外网红合作:海外红人营销渠道

在全球范围内,许多企业寻求与知名网红建立合作关系,以推广产品、共同创作内容或探索其他合作形式。以下是一些有效的方法来实现这一目标: 利用社交媒体平台:社交媒体是寻找海外网红的首选途径。平台如Instagram、YouTube和TikTok拥…

windows10使用bat脚本安装前后端环境之node环境设置

首先需要搞清楚node在本地是怎么安装配置、然后在根据如下步骤编写bat脚本: 思路 1.下载需要安装node版本zip格式包 2.配置环境变量 3.安装插件 可以根据自己需要来定义与配置(如下添加redis与node配置) bat脚本: echo off…

Node的安装和配置

1、安装Node 下载nodejs 链接:下载 | Node.js 中文网 官网下载最新版本:https://nodejs.org/en/download/ 一路点击Next,最后Finish。nodejs一般会下载在C盘里。 下载完成后,可以在cmd中查看安装的nodejs和npm版本,…