【C++初阶】第15课—模版进阶

news2025/4/24 4:21:30

文章目录

  • 1. 模版参数
  • 2. 模版的特化
    • 2.1 概念
    • 2.2 函数模版特化
    • 2.3 类模板特化
      • 2.3.1 全特化
      • 2.3.2 偏特化
  • 3. 模版的分离和编译
  • 4. 总结

1. 模版参数

  • 模版参数分为类型形参非类型参数
  • 之前我们写过的大量代码,都是用模版定义类的参数类型,跟在class和typename后面这样的参数类型就是类型形参

在这里插入图片描述


  • 非类型形参就是指用一个常量作为类(函数)的一个参数,在类(函数)模版中可以当做常量来使用

在这里插入图片描述


  • 注意
  • 模版的非类型参数是不允许传浮点数、类对象、字符串的
  • 另外模版的非类型参数必须在编译时就能确定结果,否则会报错

在这里插入图片描述


2. 模版的特化

2.1 概念

  • 通常情况下,使用模版可以实现一些与类型无关的代码,但对于一些特殊类型可能达不到预期的结果

在这里插入图片描述


  • 这时候就需要借助模版特化来解决这种特殊情况
  • 模版特化又分为函数模版特化类模版特化

2.2 函数模版特化

  • 函数模版特化的步骤:
  • 必须要有一个基础模版
  • 关键字template后面+一对尖括号<>
  • 函数名后跟跟一对尖括号,尖括号中要指定需要特化的类型
  • 函数形参:必须要和函数模版的基础参数类型匹配,否则可能会奇怪报错

在这里插入图片描述


  • 当然面对上述情况,还有另一种方法,那就是直接给出对应的函数

在这里插入图片描述


  • 总结
  • 对于函数模版中特殊情况,通常采用的就是直接给出对应的函数,编译器根据匹配原则会直接调用该函数,并且函数的代码可读性高,书写也方便,对于函数模版的特化,了解下即可

2.3 类模板特化

2.3.1 全特化

  • 全特化就是将类模板中的所有参数都确定化

在这里插入图片描述


2.3.2 偏特化

  • 偏特化是具有一定限制条件设定的特化版本

在这里插入图片描述


  • 模版补充

在这里插入图片描述


  • 模版参数类型在使用时,需要用typename告诉编译器,vector::const_iterator 这是一个类型,否则编译器就会报错,它识别时还要依靠T类型
  • 一个很好的解决办法就是:使用auto,它会自动识别类型,就可以很好的避免报错

在这里插入图片描述


  • 泛型编程
  • 如果不想使用vector容器,而是想用list容器呢

在这里插入图片描述


3. 模版的分离和编译

  • 一个程序(或项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有的目标文件链接起来形成单一的可执行文件的过程称为分离编译模式
  • C/C++程序要执行,一般分为4个步骤:预处理、编译、汇编、链接
  • 为了更好的理解代码执行的过程,接下来将详细介绍程序运行的4个过程

在这里插入图片描述


  • 补充:后缀为.o的文件(Linux系统下),win系统是.obj文件
  • 接下来看看模版函数的分离编译过程会出现哪些问题

在这里插入图片描述


  • 在main.obj文件调用Add和Add时,编译器在链接时才会去找函数地址,但是这两个函数都没有实例化生成具体代码。因此就会出现链接错误
  • 对于模版函数,通常采取的做法是,将函数的声明和定义放在同一个文件,另外库里面也是这样做的,这样在编译阶段,编译器直接就能得到模版函数的定义,就可以生成对应的代码,从而避免链接错误

在这里插入图片描述


  • 当然在头文件中直接给模版函数的定义也可以

4. 总结

  • 模版复用了代码,节省了资源,可以更快的迭代开发,主要是方便了我们,机器还要做大量的工作
  • 增加了代码的灵活性
  • 同时模版也会出现代码膨胀的问题,一个模版可能实例化出多个不同类型的对象,导致编译时间过长,这也是不可避免的问题
  • 如果出现模版编译错误,报错信息会很凌乱,不易精准定位错误

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

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

相关文章

黑阈免激活版:智能管理后台,优化手机性能

在使用安卓手机的过程中&#xff0c;许多用户会遇到手机卡顿、电池续航不足等问题。这些问题通常是由于后台运行的应用程序过多&#xff0c;占用大量系统资源导致的。今天&#xff0c;我们要介绍的 黑阈免激活版&#xff0c;就是这样一款由南京简域网络科技工作室开发的手机辅助…

Mujoco robosuite 机器人模型

import ctypes import os# 获取当前脚本所在的目录 script_dir os.path.dirname(os.path.abspath(__file__))# 构建库文件的相对路径 lib_relative_path os.path.join(dynamic_models, UR5e, Jb.so)# 拼接成完整的路径 lib_path os.path.join(script_dir, lib_relative_path…

K8s:概念、特点、核心组件与简单应用

一、引言 在当今云计算和容器技术蓬勃发展的时代&#xff0c;Kubernetes&#xff08;简称 K8s&#xff09;已成为容器编排领域的事实标准。它为管理容器化应用提供了高效、可靠的解决方案&#xff0c;极大地简化了应用的部署、扩展和运维过程。无论是小型初创公司还是大型企业…

STM32的定时器输出PWM时,死区时间(DTR)如何计算

在 STM32F429&#xff08;以及所有 STM32F4 “高级定时器”&#xff09;中&#xff0c;死区时间由 TIMx_BDTR 寄存器的 8 位 “Dead‑Time Generator” 字段 DTG[7:0] 来配置。其计算分三步&#xff1a; 计算死区时钟周期 tDTS TIM1 时钟源为 APB2 定时器时钟&#xff08;PCL…

STC32G12K128单片机GPIO模式SPI操作NorFlash并实现FatFS文件系统

STC32G12K128单片机GPIO模式SPI操作NorFlash并实现FatFS文件系统 NorFlash简介NorFlash操作驱动代码文件系统测试代码 NorFlash简介 NOR Flash是一种类型的非易失性存储器&#xff0c;它允许在不移除电源的情况下保留数据。NOR Flash的名字来源于其内部结构中使用的NOR逻辑门。…

ClickHouse 设计与细节

1. 引言 ClickHouse 是一款备受欢迎的开源列式在线分析处理 (OLAP) 数据库管理系统&#xff0c;专为在海量数据集上实现高性能实时分析而设计&#xff0c;并具备极高的数据摄取速率 1。其在各种行业中得到了广泛应用&#xff0c;包括众多知名企业&#xff0c;例如超过半数的财…

智能体MCP 实现数据可视化分析

参考: 在线体验 https://www.doubao.com/chat/ 下载安装离线体验 WPS软件上的表格分析 云上创建 阿里mcp:https://developer.aliyun.com/article/1661198 (搜索加可视化) 案例 用cline 或者cherry studio实现 mcp server:excel-mcp-server、quickchart-mcp-server

再看开源多模态RAG的视觉文档(OCR-Free)检索增强生成方案-VDocRAG

前期几个工作提到&#xff0c;基于OCR的文档解析RAG的方式进行知识库问答&#xff0c;受限文档结构复杂多样&#xff0c;各个环节的解析泛化能力较差&#xff0c;无法完美的对文档进行解析。因此出现了一些基于多模态大模型的RAG方案。如下&#xff1a; 【RAG&多模态】多模…

深入浅出 NVIDIA CUDA 架构与并行计算技术

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、CUDA为何重要&#xff1a;并行计算的时代 2、NVIDIA在…

FPGA系列之DDS信号发生器设计(DE2-115开发板)

一、IP核 IP(Intellectual Property)原指知识产权、著作权等&#xff0c;在IC设计领域通常被理解为实现某种功能的设计。IP模块则是完成某种比较复杂算法或功能&#xff08;如FIR滤波器、FFT、SDRAM控制器、PCIe接口、CPU核等&#xff09;并且参数可修改的电路模块&#xff0c…

【Dv3Admin】从零搭建Git项目安装·配置·初始化

项目采用 Django 与 Vue3 技术栈构建&#xff0c;具备强大的后端扩展能力与现代前端交互体验。完整实现了权限管理、任务队列、WebSocket 通信、系统配置等功能&#xff0c;适用于构建中后台管理系统与多租户平台。 本文章内容涵盖环境搭建、虚拟环境配置、前后端部署、项目结…

P3416-图论-法1.BFS / 法2.Floyd

这道题虽然标签有floyd但是直接bfs也能过 其实事实证明还是bfs快&#xff0c;因为bfs只需要遍历特定的点&#xff0c;但是floyd需要考虑遍历所有可能的中介点 法1.BFS 用字典存储每个点所能普及的范围&#xff0c;然后用对每个点bfs进行拓展 nint(input())temp[]#xmax0;yma…

极狐GitLab 议题和史诗创建的速率限制如何设置?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 议题和史诗创建的速率限制 (BASIC SELF) 速率限制是为了控制新史诗和议题的创建速度。例如&#xff0c;如果您将限制设置为 …

提交到Gitee仓库

文章目录 注册配置公钥创建空白的码云仓库把本地项目上传到码云对应的空白仓库中 注册 注册并激活码云账号&#xff08; 注册页面地址&#xff1a;https://gitee.com/signup &#xff09; 可以在自己C盘/用户/用户名/.ssh 可以看到 有id_rsa.pub 以前在GitHub注册时搞过&…

oracle中错误总结

oracle中给表起别名不能用as&#xff0c;用as报错 在 Oracle 数据库中&#xff0c;​​WITH 子句&#xff08;即 CTE&#xff0c;公共表表达式&#xff09;允许后续定义的子查询引用前面已经定义的 CTE​​&#xff0c;但 ​​前面的 CTE 无法引用后面的 CTE​​。这种设计类似…

纽约大学具身智能体在城市空间中的视觉导航之旅!CityWalker:从海量网络视频中学习城市导航

作者&#xff1a;Xinhao Liu, Jintong Li, Yicheng Jiang, Niranjan Sujay, Zhicheng Yang, Juexiao Zhang, John Abanes, Jing Zhang, Chen Feng单位&#xff1a;纽约大学论文标题&#xff1a;CityWalker: Learning Embodied Urban Navigation from Web-Scale Videos论文链接&…

OpenCV颜色变换cvtColor

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 颜色变换是imgproc模块中一个常用的功能。我们生活中看到的大多数彩色图片都是RGB类型的&#xff0c;但是在进行图像处理时需要用到灰度图、二值图、HSV&#xff08;六角锥体模型&#xff0c;这个模型中颜色的…

Manus技术架构、实现内幕及分布式智能体项目实战

Manus技术架构、实现内幕及分布式智能体项目实战 模块一&#xff1a; 剖析Manus分布式多智能体全生命周期、九大核心模块及MCP协议&#xff0c;构建低幻觉、高效且具备动态失败处理能力的Manus系统。 模块二&#xff1a; 解析Manus大模型Agent操作电脑的原理与关键API&#xf…

下载油管视频 - yt-dlp

文章目录 1. yt-dlp与you-get介绍1.1 主要功能对比1.2 使用场景1.3 安装 2. 基本命令介绍2.1 默认下载视频2.2 指定画质和格式规则2.3 下载播放列表2.4 备注 3. 参考资料 之前只使用you-get下载b站视频&#xff0c;当时了解you-get也可下载油管视频&#xff0c;但之前无此需求&…

济南通过首个备案生活服务大模型,打造行业新标杆

近日&#xff0c;一则振奋人心的消息在人工智能领域传开&#xff1a;济南本土企业丽阳神州智能科技有限公司自主研发的 “丽阳雨露” 大模型成功通过国家网信办的备案。这一成果不仅是济南企业在科技创新道路上的重大突破&#xff0c;更标志着我国在生活服务领域的人工智能应用…