C++ 模板(基础)

news2024/10/16 14:56:26

前言:

C++ 中的模板是一个强大的功能,允许程序员编写通用的代码,这些代码可以处理任何数据类型。模板使得代码更加灵活和可重用,而不必为每种数据类型编写重复的代码。下面详细解释 C++ 中的模板

内容摘要:

本文内容包含最基本的函数模板和类模板的基础认识和使用,然后通过另一个角度,从函数模板的特化方面,介绍了函数模板的特化和类模板的特化,分析了模板为什么一般不能通过分离编译实现的原理,最后将模板的优劣势进行总结。

函数模板

在C语言中,我们要实现一个两数之和,当我们是实现出一个整数的加法函数进行两个整数的加法,当我们又有需求进行含有小数的数据运算时,浮点数进行隐式类型转换调用我们写的那个整形的加法函数,最后运算出来的结果会造成精度的丢失,要想进行精度的保留,我们又需要重新写一个结构一模一样的函数,只是数据的类型发生了改变,这就让人很难受,因此C++ 中提出泛型编程的概念,通过函数模板可以完美解决问题。

函数模板的格式 

关键字template + <class/typname T>
这里class和typname是等价的 这里模板参数可以用任意字母 一般用T

通过关键字template 告诉编译器我们下面写的这个函数是一个函数模板

当函数模板被调用时,模板参数T会进行实例化相对应的类型,例如当我们传参进行两个整数的运算时,模板参数T自动实例化成int,同理,当我们传参浮点数进行运算时,T会实例化出double。

类模板

类模板格式

类模板的格式和函数模板相同

关键字template + <class/typname T>
这里class和typname是等价的 这里模板参数可以用任意字母 一般用T

类模板通过类似于函数传参将模板参数进行实例化

通过之前的学习我们接触过的类模板参数用途有好几种,其一就是例如C++标准库中的容器vector,通过类模板参数T,实现容器各种不同数据类型数据的存储,这里能够更好的体会泛型编程的好处,要是C++没有引入泛型编程,vector底层通过函数重载,得写各种类型存储vector容器。其二就是在模拟实现list中的时候,见识到了通过多定义模板参数更简洁高效实现了普通迭代器和const迭代器;其三,在实现反向迭代器时,利用类模板参数,通过正向迭代器复用进行实现

类型模板参数解决typedef后只能存储单个数据的窘境

非类型模板参数

非类型模板参数可以增强模板的灵活性,它允许模板定义中使用常数作为模板参数

类型模板参数和非类型模板参数的区分

类型模板参数顾名思义,用来表示数据的类型的例如通过静态数组类模板中的T,非类型模板参数,而N就属于非类型模板参数

利用非类型模板参数定义静态数组类,通过宏也可以进行实现,但是会出现局限,例如以上代码当我们想要进行将静态数组a1开十个空间,将静态数组a2开二十个空间时,通过宏就没有办法进行解决,但是通过非模板类型参数就可以轻易解决。

非类型模板参数的注意事项

  • 能够作为非类型模板参数的只能是整形家族中的 例如 int、size_t、long、char、bool
  • 非类型模板参数在编译期就能够确认结果

模板的特化

函数模板的特化

通过特化去解决特别的问题,例如我们想要取通过指针比较指针指向的地址处数据的大小,如果我们不进行处理直接用指针进行比较的话,比较的是指针指向的地址在进行比较,显然这并不是我们想要的结果,所以说不符合模板的情况下我们需要进行特化处理。

函数模板特化的格式:

template<>
函数类型 函数名<函数特化的类型>(形参)

注意:函数形参表的类型和个数必须和模板函数相同,否则编译器会报一些奇奇怪怪的错误

解决办法:

方法一:通过函数重载进行解决

方法二:通过函数模板的特化进行解决

思考:当出现模板解决不了的问题,两种解决办法的代码都存在时,会走哪一部分的代码去解决问题呢??当然是函数重载啦,因为函数重载是直接给出来的,而函数模板的特化还是需要实例化出来相对应的类型,然后再进行走函数特化的部分。

在涉及到模板处理不了的问题时,我们一般通过函数重载进行解决,函数重载的代码可读性高。

类模板的特化

同样是去处理通过模板难以处理的问题

全特化

全特化是将模板所有的模板参数都进行确定化


偏特化

偏特化是一种对于模板加了一些限制,分为部分特化和参数进一步限制两种类型

  • 部分特化

将一部分的参数进行特化处理

  • 参数进一步限制

将参数进行进一步限制,所设计的一个特化版本

模板的分离编译

什么是模板的分离编译

一个程序有多个源文件共同组成,每个源文件又会单独编译成目标文件(例如,.o.obj文件),然后通过链接器生成可执行文件

对于我们程序来说通过使用分离编译能够增强代码的可维护性,我们通常都会使用分离编译和模块化进行程序的开发,但是模板的分离编译并不是这样,使用模板的函数和类都不建议使用模板的分离编译,那么这是为什么呢,我们下面通过分析解决一下这个问题。

假如进行模板分离编译

使用模板的注意事项:

不将模板进行分离编译,防止出现链接不上

若进行分离编译,进行显示实例化(不推荐使用)

模板总结

优点:

通过使用模板,节省资源,增加开发效率

缺点:

代码膨胀,编译速率变慢

出现模板编译错误时,错误信息非常凌乱,不易定位错误

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

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

相关文章

vue使用jquery的ajax,页面跳转

一、引入jquery依赖 打开终端更新npm npm install -g npm 更新完后引入输入npm install jquery 加载完后 在最外层的package.json文件中加入以下代码 配置好后导入jquery 设置变量用于接收服务器传输的数据 定义ajax申请数据 服务器的Controller层传输数据 &#xff08;…

传输层协议UDP详解

目录 一. 知识准备 1.1 传输层 1.2 重识端口号 二. UDP协议 三. UDP协议特点 一. 知识准备 1.1 传输层 前面已经讲过&#xff0c;HTTP协议是应用层协议&#xff0c;在此之前&#xff0c;我们短暂的认为HTTP是直接通过应用层与外界通信的。但是我们要知道&…

新手爬虫DAY1

这个错误信息表明在你的Python程序中&#xff0c;re.search() 函数没有找到预期的匹配项&#xff0c;因此返回了 None。当你尝试在 None 对象上调用 group(1) 方法时&#xff0c;Python 抛出了一个 AttributeError。 具体来说&#xff0c;错误发生在 pc.py 文件的第6行&#x…

《RECONX: RECONSTRUCT ANY SCENE FROM SPARSEVIEWS WITH VIDEO DIFFUSION MODEL》论文阅读

论文地址&#xff1a;https://arxiv.org/pdf/2408.16767 项目地址&#xff1a;GitHub - liuff19/ReconX: ReconX: Reconstruct Any Scene from Sparse Views with Video Diffusion Model ---------------------------------------------------------------------------------…

Open-WebUI

Open-WebUI特点⭐ ️直观的界面&#xff1a;聊天界面从 ChatGPT 中汲取灵感&#xff0c;确保用户友好的体验。响应式设计&#xff1a;在桌面和移动设备上享受无缝体验。⚡快速响应&#xff1a;享受快速响应的性能。轻松设置&#xff1a;使用 Docker 或 Kubernetes&#xff08;…

【自然语言处理】Encoder-Decoder模型中Attention机制的引入

在 Encoder-Decoder 模型中引入 Attention 机制&#xff0c;是为了改善基本Seq2Seq模型的性能&#xff0c;特别是当处理长序列时&#xff0c;传统的Encoder-Decoder模型容易面临信息压缩的困难。Attention机制可以帮助模型动态地选择源序列中相关的信息&#xff0c;从而提高翻译…

硬盘文件误删:原因、恢复方案与预防措施

一、硬盘文件误删现象描述 在日常使用电脑的过程中&#xff0c;硬盘文件误删是一个常见且令人头疼的问题。许多用户在进行文件整理、删除无用资料或进行系统清理时&#xff0c;一不小心就可能将重要文件误删。这些误删的文件可能包括工作文档、学习资料、家庭照片、视频等&…

【含文档】基于Springboot+Vue的采购管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

SpringBoot实现桂林旅游的智能推荐

3系统分析 3.1可行性分析 通过对本桂林旅游景点导游平台实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本桂林旅游景点导游平台采用SSM框架&#xff0c;JAVA作…

基于Docker安装Grafana及其基本功能

Grafana是一款用Go语言开发的开源数据可视化工具&#xff0c;可以做数据监控和数据统计&#xff0c;带有告警功能。 拉取Grafana镜像 docker pull grafana/grafana 运行镜像 docker run -d -p 3000:3000 --namegrafana grafana/grafana 打开浏览器&#xff0c;访问 http://l…

【Vue】Vue2(10)

文章目录 1 过度与动画1.1 Test.vue1.2 Test2.vue1.3 Test3.vue1.4 TodoList_动画&#xff1a;MyItem.vue 2 配置代理服务器2.1 方法一2.2 方法二2.3 vue.config.js2.4 App.vue 3 github搜索案例3.1 静态页面3.2 Search.vue3.3 List.vue3.4 App.vue3.5 main.js3.6 github搜索案…

免费插件集-illustrator插件-Ai插件-路径点到点连线

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;实现简单路径内部点到点连线功能。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550…

打造卓越APP体验:13款界面设计软件推荐

你知道如何选择正确的UI设计软件吗&#xff1f;你知道设计美观的用户界面&#xff0c;及带来良好用户体验的APP&#xff0c;需要什么界面设计软件吗&#xff1f;基于APP界面的功能不同&#xff0c;选择的APP界面设计软件也会有所不同。然而&#xff0c;并不是要把所有APP界面设…

1.2.3 TCP IP模型

TCP/IP模型&#xff08;接网叔用&#xff09; 网络接口层 网络层 传输层 应用层 理念&#xff1a;如果某些应用需要“数据格式转换”“会话管理功能”&#xff0c;就交给应用层的特定协议去实现 tip&#xff1a;数据 局部正确不等于全局正确 但是&#xff0c;数据的 全局正…

docker (desktopcompose) download

docker docker-compose download 百度网盘获取离线包链接release-notes 参考dockerdocker-composewlspowershell

基于Spring Boot的大创项目成本控制系统

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Linux下ClamAV源代码安装与使用说明

Linux下ClamAV源代码安装与使用说明 ClamAV(Clam AntiVirus)是一款开源的防病毒工具,广泛应用于Linux平台上的网络安全领域。它以其高效的性能和灵活的配置选项,成为网络安全从业人员的重要工具。ClamAV支持多线程扫描,可以自动升级病毒库,并且支持多个操作系统,包括Li…

扫普通链接二维码打开小程序

1. 2.新增规则&#xff08;注意下载文件到跟目录下&#xff0c;需要建个文件夹放下载的校验文件&#xff09; 3.发布 ps&#xff1a;发布后&#xff0c;只能访问正式版本。体验版本如果加了 测试链接http://xxx/xsc/10 那么http://xxx/xsc/aa.....应该都能访问 例如aa101 aa…

5 -《本地部署开源大模型》在Ubuntu 22.04系统下ChatGLM3-6B高效微调实战

在Ubuntu 22.04系统下ChatGLM3-6B高效微调实战 无论是在单机单卡&#xff08;一台机器上只有一块GPU&#xff09;还是单机多卡&#xff08;一台机器上有多块GPU&#xff09;的硬件配置上启动ChatGLM3-6B模型&#xff0c;其前置环境配置和项目文件是相同的。如果大家对配置过程还…

前端excel的实现方案Luckysheet

一、介绍 Luckysheet是一款纯前端类似excel的在线表格&#xff0c;功能强大、配置简单、完全开源的插件。目前已暂停维护&#xff0c;但是其已有功能大概能满足常见需求的使用。 二、引入 ①cdn引入&#xff08;目前应该已经不支持&#xff0c;可自行尝试&#xff09; <l…