当前位置: 首页 > article >正文

【学习篇】第18期 C++模板

【你奶奶都能听懂的C】第18期 C模板目录【你奶奶都能听懂的C】第18期 C模板开头一.模板1.概念2.用法分类1函数模板2类模板二.非类型模板参数三.模板的特化1.概念1函数模板特化2类模板特化a.全特化b.偏特化四.模板分离定义1.什么是分离编译2.模板的分离编译问题3.解决方法五.模板总结结尾往期回顾1.[【学习篇】 第16期 全站最全七大排序超超超详解](https://blog.csdn.net/2501_93298789/article/details/156611775?spm1001.2014.3001.5502)2.[【实战篇】 第13期 算法竞赛_数据结构超详解上](https://blog.csdn.net/2501_93298789/article/details/157032786?spm1001.2014.3001.5502)3.[【实战篇】 第14期 算法竞赛_数据结构超详解下](https://blog.csdn.net/2501_93298789/article/details/157617539?spm1001.2014.3001.5502)开头ok了大家好久不见今天这一期我们来学习C中的模板知识废话不多说我们直接开始一.模板1.概念在 C 编程中模板 (Template) 是实现泛型编程的核心工具。它允许我们编写与类型无关的通用代码极大地提高了代码的复用性和可维护性。这是官方的解释第一眼看上去好比没说下面我来举个例子带着大家理解:假如现在我们要写一个加法计算器可以完成两个数的相加一般我们就会这样写如上图我们可以利用函数重载来简化可是最后写出来还是太挫了我们就是想写两个数相加每一个函数完成的功能是一样的这时就要引出模板这个概念了用你奶奶都能听懂的话来解释模板就是一个空瓶子你现在要完成 ”接水“ 这个操作要接的有酱油、水、醋、酒等等使用模板就相当于为了完成 “接水” 这个目标我们不需要去专门准备不同的瓶子只需要一个瓶子一套模板就能完成相同的操作更通俗来讲C模板就是造一个通用空壳子壳子不动随便换里面装的东西不用重复造新壳子。2.用法分类模板分为函数模板和类模板两种它们的本质都是编译器根据传入的类型自动生成对应版本的代码。• template声明这是一个模板• typename关键字也可以使用class两者在模板中完全等价• T类型参数代表一个任意的类型1函数模板函数模板允许我们定义一个通用的函数它可以处理任意类型的数据。像上面那个加法模拟器的例子如果使用函数模板就可以这样写首先声明了一个函数模板T 代表了我们这个函数的类型参数像这样写当我们调用 add 函数时编译器会自动推导 a , b 参数的类型是什么但是会出现这个问题我们向 add 函数传入了 1 和 4.9 发现编译器报错了这是为什么呢原因是在模板中类型参数匹配失败add 这个函数模板类型参数只有一个 T ,传入整型 1 时编译器会认为 类型参数 T 就是整型 int但是第二个参数又会识别出浮点类型所以会报错那要怎么改呢如上图那就写两个类型参数各自匹配函数的两个参数2类模板类模板允许我们定义一个通用的类它的成员变量和成员函数可以使用任意类型。我们在使用C的STL时是不是会这样声明大家有没有想过STL中给我们提供的数据结构是如何匹配上我们的参数类型的有的同学结合之前我们手动模拟实现STL我们可以用 typedef int/char/double Datetype ,但是仔细一想这样不能解决问题难不成每次我们使用STL的时候还得去更改类型吗另外对于自定义类型这样也是不行的这就要靠模板解决STL就是用一个个类模板实现的这是自己模拟实现的list可以看到类的成员变量用的就是模板的类型参数让编译器来自动匹配二.非类型模板参数普通模板参数 typename T 是「传类型」目的是识别不同的参数类型而非类型模板参数是「传常量值」目的是确定目标值注意非类型模板参数只能是整型家族STL 中有个叫 array 的结构这个就是个要提前告知数组类型和大小的数据结构其实就是用了这样的类模板三.模板的特化1.概念模板特化就是模板的特殊化处理是指当模板参数为特定类型时我们提供一个专门的实现版本。为什么需要模板特化• 通用模板对于某些特定类型可能无法正确工作• 对于某些特定类型我们可以提供更高效的实现• 可以针对特定类型添加额外的功能对于模板特化可以分为函数模板特化、类模板特化1函数模板特化函数模板特化是指为某个特定的类型提供一个专门的函数实现。举个例子我们要写个比较小于的函数但是这是不能满足所有类型的例如我们在类和对象这一期博客中写的日期类这样比较就用问题这里举另一个例子这里不应该是 “” 吗 为什么输出的是 “”原因是调用 lessf 函数传入的参数是 a, b 的地址它比较是按照地址的大小来的如果想要 lessf 函数完成自动解引用比较可以这样进行函数特化就是编译器识别到参数类型是我们专门写的特化类型时就会调用这个特殊化处理过的函数2类模板特化类模板特化分为全特化和偏特化两种。a.全特化全特化是指为所有模板参数都提供具体的类型即类中的所有类型参数都进行特殊处理如上图一旦编译器识别到传入的类型是我们特化的就会调用特化的这个类模板b.偏特化偏特化是指为部分模板参数提供具体的类型或者对模板参数进行一些限制偏特化有两种形式•部分参数特化当模板有多个参数时只特化其中一部分•参数范围特化对模板参数的类型进行限制如指针类型、引用类型等1.部分参数特化、如上图只要第二个参数和特化版类模板匹配上就会直接调用特化版的类2.参数范围特化指针类型如上图也可以利用偏特化限制具体类型四.模板分离定义1.什么是分离编译C 程序通常采用分离编译的方式• 将程序分为多个.cpp源文件• 每个源文件单独编译成目标文件.o或.obj• 最后将所有目标文件链接成可执行文件2.模板的分离编译问题模板不能像普通函数和类那样进行分离编译原因简单来说就是模板函数模板、类模板本身不是可执行代码它只是一个 “模具” 编译器在看到模板定义时并不知道将来会用哪些类型int、string、自定义类等来实例化它因此不会生成任何具体的机器码只有当模板被实际使用实例化时编译器才会根据传入的具体类型用这个 “蓝图” 生成一份对应类型的、真正可执行的代码。3.解决方法• 方法一将模板的声明和实现都写在头文件中推荐这是最常用、最简单的方法。将模板的所有代码都放在头文件中这样当其他文件包含这个头文件时编译器就能看到完整的模板实现从而生成对应的代码。• 方法 2在模板实现文件的末尾显式实例化五.模板总结模板是 C 泛型编程的核心它让我们能够编写与类型无关的通用代码极大地提高了代码的复用性和可维护性。结尾今天这一期对C模板的学习就到这里了谢谢你的观看如果对你有所帮助感谢你的点赞收藏支持我我主页里有更好康的哟往期回顾1.【学习篇】 第16期 全站最全七大排序超超超详解2.【实战篇】 第13期 算法竞赛_数据结构超详解上3.【实战篇】 第14期 算法竞赛_数据结构超详解下

相关文章:

【学习篇】第18期 C++模板

【你奶奶都能听懂的C】第18期 C模板 目录【你奶奶都能听懂的C】第18期 C模板开头:一.模板1.概念2.用法分类(1)函数模板(2)类模板二.非类型模板参数三.模板的特化1.概念(1)函数模板特化&#xff…...

Python自动化Yandex.Metrika数据采集:从API封装到ETL管道实战

1. 项目概述:一个被低估的Yandex.Metrika数据助手 如果你正在运营一个面向俄语区或东欧市场的网站,或者你的产品在这些地区有用户,那么你一定对Yandex.Metrika不陌生。它就像是俄罗斯的Google Analytics,是洞察用户行为、分析流量…...

华为CANN/pypto全1张量创建函数

pypto.ones 【免费下载链接】pypto PyPTO(发音: pai p-t-o):Parallel Tensor/Tile Operation编程范式。 项目地址: https://gitcode.com/cann/pypto 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atl…...

Go HTTP客户端熔断保护:ok-breaker原理、配置与生产实践

1. 项目概述与核心价值最近在折腾一些自动化脚本和API调用时,遇到了一个老生常谈但又极其烦人的问题:如何优雅地处理那些“不稳定”的第三方服务?我说的不稳定,不是指服务完全宕机,而是那种间歇性抽风、响应时快时慢、…...

年春节AI发展大事记

. GIF文件结构 相比于 WAV 文件的简单粗暴,GIF 的结构要精密得多,因为它天生是为了网络传输而设计的(包含了压缩机制)。 当我们用二进制视角观察 GIF 时,它是由一个个 数据块(Block) 组成的&…...

掌握AI教材生成技巧,借助低查重工具,3天完成50万字教材编写!

编写教材的困境与 AI 解决方案 谁没有遇到过编写教材时的框架难题呢?面对空白的文档,常常会呆坐半个小时,完全不知从何下手——先解释概念好,还是先引用案例?章节该根据逻辑划分,还是根据课时来安排&#…...

Slack与Cursor AI本地自动化助手:提升开发效率的智能工作流

1. 项目概述:一个连接Slack与Cursor AI的本地自动化开发助手 如果你和我一样,每天大部分工作时间都泡在Slack和代码编辑器里,那你肯定也经历过这种场景:产品经理或同事在Slack里提了一个需求,你看到了,然后…...

大模型岗位选哪个?3大方向对比+简历避坑指南!后端转大模型必看!

本文对比了大模型岗位的三个主要方向:LLM应用工程师、算法工程师和AI全栈工程师。LLM应用工程师侧重于基于大模型构建应用系统,需要突出的能力包括技术选型、问题解决和落地交付;算法工程师负责模型训练和微调,需重点展示微调方法…...

面向参数高效边缘语言模型的正交基分解映射

正交基分解 作者:李金雨 标题建议 《OBDM: Orthogonal Basis Decomposition Mapping for Parameter-Efficient Edge Language Models》 中文标题:《OBDM:面向参数高效边缘语言模型的正交基分解映射》 摘要 (Abstract) 大型语言模型在移动设备和边缘计算场景中的部署受限…...

lvgl_v8之基于arc实现一个交易成功动画

static lv_obj_t* widget_check_line; static lv_point_t widget_check_points[3]; static const lv_point_t widget_check_full_points[...

为内部知识库问答机器人集成taotoken多模型后备路由能力

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为内部知识库问答机器人集成Taotoken多模型后备路由能力 在企业内部知识库问答系统的构建中,服务稳定性是核心诉求之一…...

CANN量化注意力梯度算子

aclnnQuantFlashAttentionScoreGrad 【免费下载链接】ops-transformer 本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-transformer 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DT…...

lvgl_v8之arc控件修改前景色和背景色代码示例

static void arc_draw_event_cb(lv_event_t* e) {lv_event_code_t code = lv_event_get_code(e);...

云原生开发脚手架Jetski:从工具集设计到自动化部署实战

1. 项目概述:从“Jetski”到“Jetpack”的云端开发范式革新最近在GitHub上看到一个名为“jetski”的项目,由开发者Calfur创建。初看这个名字,很多人可能会联想到水上摩托艇,但在软件开发的语境下,它指向的是一种截然不…...

通用人工智能系统(GPAIS)架构、挑战与可信治理实践

1. 通用人工智能系统(GPAIS)究竟是什么?如果你关注AI领域,最近一定频繁听到“通用人工智能系统”(General-Purpose AI Systems, GPAIS)这个词。它听起来像是科幻电影里那种无所不能的AI,但现实中…...

对话式AI的学术诚信挑战:从技术原理到架构级解决方案

1. 项目概述:当对话式AI成为双刃剑作为一名长期关注人工智能技术演进与落地的从业者,我见证了从早期基于规则的聊天机器人到如今以ChatGPT为代表的大型语言模型(LLM)的惊人飞跃。这项技术的核心,在于其基于Transformer…...

3分钟彻底清理Windows右键菜单:ContextMenuManager让你的电脑操作效率提升200%

3分钟彻底清理Windows右键菜单:ContextMenuManager让你的电脑操作效率提升200% 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 还在为Windows右键菜单…...

2026国内GPT API稳定服务商TOP10:企业级99.9%可用率口碑榜

摘要: 选GPT API服务商还在纠结稳定性?2026年的真实评测报告告诉你,企业级API网关的99.9%可用率不再是口号。本文从平台可用率、网络延迟、成本控制、合规安全四大维度,结合第三方实测数据,为你整理国内GPT API稳定服务…...

ChatCat:基于Electron的本地AI聊天客户端部署与配置指南

1. 项目概述:一个开源的本地AI聊天应用最近在折腾本地大语言模型(LLM)的朋友,可能都绕不开一个核心痛点:如何找到一个既轻量、易部署,又功能强大、界面友好的客户端来管理你的模型和对话?如果你…...

多模态大模型Awesome列表:从资源导航到高效学习与开发实践

1. 项目概述:一个多模态大模型的“藏宝图” 如果你最近在折腾大语言模型,尤其是对能“看懂”图片、“听懂”声音的多模态模型感兴趣,那你大概率已经听过或搜过“Awesome”系列的开源项目。这类项目通常是一个精心整理的列表,像一张…...

一键提取视频PPT:开源智能视频内容自动化提取的革命性工具

一键提取视频PPT:开源智能视频内容自动化提取的革命性工具 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 智能视频处理和内容自动化提取正在改变知识管理的工作流程。ex…...

ACL 2025 最佳论文解读:《Language Models Resist Alignment: Evidence From Data Compression》

ACL 2025 最佳论文解读:《Language Models Resist Alignment: Evidence From Data Compression》 本文面向大模型工程师和 NLP 从业者,帮助读者理解 ACL 2025 最佳论文《Language Models Resist Alignment: Evidence From Data Compression》的核心贡献…...

09-扩展知识——05. date 类 - 处理日期

05. date 类 - 处理日期 概述 date 类是 datetime 模块中专门处理日期(年、月、日)的类,不包含时间和时区信息。它是日常日期操作中最常用的类之一。维度内容What处理日期(年、月、日)的类Why专门处理日历日期&#xf…...

React聊天机器人组件集成指南:从UI定制到AI后端连接

1. 项目概述与核心价值最近在折腾一个基于React的前端聊天机器人项目,核心想法是把类似ChatGPT的对话交互体验,无缝集成到自己的Web应用里。这个需求其实挺普遍的,无论是做客服助手、智能问答面板,还是想给自己的产品加个AI对话的…...

STM32F103 学习笔记-21-串口通信(第5节)—串口2345代码移植和讲解

本章基于 STM32F103 标准外设库开发,从最基础的“串口是什么”讲起,通过生活化类比拆解硬件原理,配合逐行注释的可运行代码,让零基础读者读完就能实现单片机与电脑的双向通信。一、什么是串口通信?1.1 串口的本质&…...

保姆级 Kali Linux 安装教程|零基础小白也能看懂,从镜像下载到虚拟机配置全程图文详解,零报错上手

kali 背景 基于Debian的Linux操作系统 Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统。每一季度更新一次。由Offensive Security Ltd维护和资助。最先由Offensive Security的Mati Aharoni和Devon Kearns通过重写BackTrack来完成,Back…...

LLMCompiler:大语言模型并行函数调用编译器原理与实践

1. 项目概述:一个为LLM设计的“并行函数调用编译器”如果你正在构建基于大语言模型(LLM)的智能体应用,并且被工具调用(Function Calling)的串行延迟和高昂成本所困扰,那么LLMCompiler这个项目值…...

2026 年了,国产大模型和 GPT/Claude的差距还有多大?

作为一名每天要在终端、代码库和几十个 API 接口里反复横跳的开发者,我在这几年见证了 AI 行业最疯狂的三年。记得 2023 年大家还在笑话国产大模型只会“套壳”,2024 年开始被 DeepSeek 的性价比震撼,而到了 2026 年的今天,坐在电…...

通用人工智能系统(GPAIS)的技术挑战与可信AI治理框架

1. GPAIS:从概念到现实,我们离“通用”还有多远?如果你关注AI领域,最近几年一定被各种“全能”模型刷过屏。从能写代码、画图、聊天的ChatGPT,到能处理多模态信息的GPT-4V,再到各种宣称能“理解世界”的智能…...

容器是怎么管理 Bean 的?

文章目录1. 核心蓝图:BeanDefinition2. 核心管理流程:生命周期流水线第一阶段:准备与实例化第二阶段:装配与填充第三阶段:初始化(Initialization)第四阶段:生存与销毁3. 核心机制&am…...