第十三站:深度学习模板
一、基础类型模板参数定义用 class / typename 声明代表一个数据类型在实例化时传入类型名参数占位符 T 代表任意类型int、自定义类、指针等实例化尖括号内必须填类型举例#includeiostreamusing namespace std;// 类型模板参数class / typename 完全等价templateclassT// templatetypename T 等效写法classA{};intmain(){return0;}小结1.class 和 typename 在模板参数列表中无区别均可用来声明类型参数二、传统固定数组模板的缺陷#define 全局常量举例1.固定长度为100#defineN100templateclassTclassArray{public:private:T_a[N];// 数组长度由全局宏N固定};intmain(){Arrayinta1;return0;}2.固定长度为1000#defineN1000templateclassTclassArray{public:private:T_a[N];};intmain(){Arrayinta1;return0;}这种定义方法带来的最核心的问题就是宏N是全局唯一常量整个程序中只能有一种长度导致无法在同一个程序中同时创建同类型不同长度的数组对象。三、非类型模板参数解决宏的缺陷定义不用 typename/class用一个参数代表一个常量值实例化时传值templateintN,doubleX// N、X 是非类型模板参数structArray{};举例类型参数 整型非类型参数// T类型参数Nint型非类型模板参数templateclassT,intNclassArray{public:private:T_a[N];};intmain(){Arrayint,100a1;// int数组长度100Arrayint,1000a2;// int数组长度1000return0;}注意1.非类型模板参数只能是整型常量浮点数(double,float)、类对象以及字符串是不允许作为非类型模板参数的。非类型的模板参数必须在编译期就能确认结果非类型模板参数允许的类型编译时报错如下非类型模板参数允许的类型编译时情况如下没有报错仅支持编译期可求值的常量整数类型 整型char/short/int/long/longlong/无符号整型四模板的特化模板的特化定义函数模板/类模板是一套通用的代码但是有些特殊类型不能用这套通用的代码我们就需要针对这种特殊类型对模板做一个特化就叫做模板的特化。模板的特化又分为函数模板特化和类模板的特化函数模板特化全特化即是将模板参数列表中所有的参数都确定化。特化步骤必须要先有一个基础的函数模板关键字template后面接一对空的尖括号函数名后跟一对尖括号尖括号中指定需要特化的类型函数形参表: 必须要和模板函数的基础参数类型完全相同//函数模板特化templateclassTboolIsEqual(Tleft,Tright){returnleftright;//直接用 比较两个同类型变量//缺陷char* 字符串指针比较只会对比地址不会对比字符串内容}//针对char*类型的特殊化处理// template 代表无剩余模板参数全特化templateboolIsEqualchar*(char*left,char*right){// strcmp 逐字符对比字符串内容returnstrcmp(left,right)0;}intmain(){inta0,b1;coutIsEqual(a,b)endl;// 调用通用模板输出0constchar*p1hello;constchar*p2world;coutIsEqual(p1,p2)endl;// 调用char*特化版本输出0return0;}小结全特化语法template 空模板头显式指定类型 char*类模板特化包含全特化和偏特化全特化全特化即是将模板参数列表中所有的参数都确定化。举例//类模板全特化//1. 通用双参数类模板templateclassT1,classT2classData{public:Data(){cout原模版类DataT1, T2endl;}private:T1_d1;T2_d2;};//2. 针对 Dataint, char 的全特化template// 空模板头 全特化classDataint,char//类型全部写死{public:Data(){cout全特化: Dataint, charendl;}private:// 可完全重写成员和通用模板结构无关};//测试intmain(){Dataint,intd1;// 通用模板输出 原模版类DataT1, T2Dataint,chard2;// 匹配全特化输出 全特化: Dataint, charreturn0;}偏特化包含参数固定型偏特化和类型修饰偏特化参数固定型偏特化只固定一部分模板参数剩余参数仍保留泛型称为偏特化。【偏特化只存在于类模板函数模板不支持偏特化。】//类模板偏特化//1. 通用双参数类模板templateclassT1,classT2classData{public:Data(){cout原模板类DataT1, T2endl;}private:T1_d1;T2_d2;};//2. 针对 Dataint, char 的全特化template// 空模板头 全特化classDataint,char//类型全部写死{public:Data(){cout全特化: Dataint, charendl;}private:// 可完全重写成员和通用模板结构无关};// 偏特化T1固定intT2仍为可变类型templateclassT2//部分参数写死剩余泛型classDataint,T2{public:Data(){cout偏特化: Dataint, T2endl;}private:};//测试intmain(){Dataint,doubled1;//偏特化: Dataint, T2Dataint,floatd2;//偏特化: Dataint, T2Dataint,chard3;//全特化: Dataint, charDatastring,intd4;//原模板类DataT1, T2return0;}小结匹配优先级从高到低全特化 偏特化 通用基础模板类型修饰型偏特化不固定参数只限制参数为指针 / 引用//类型修饰型偏特化// ////1. 通用双参数类模板templateclassT1,classT2classData{public:Data(){cout原模板类DataT1, T2endl;}private:T1_d1;T2_d2;};//两个参数偏特化为指针类型templateclassT1,classT2classDataT1*,T2*{public:Data(){cout类型修饰型偏特化DataT1*, T2*endl;}private:T1_d1;T2_d2;};//两个参数偏特化为引用类型templateclassT1,classT2classDataT1,T2{public:Data(constT1d1,constT2d2):_d1(d1),_d2(d2){cout类型修饰型偏特化DataT1, T2endl;}private:constT1_d1;constT2_d2;};intmain(){Datadouble,intd1;//原模板类DataT1, T2Dataint,doubled2;//原模板类DataT1, T2Dataint*,int*d3;//类型修饰型偏特化DataT1*, T2*Dataint,intd4(1,2);//类型修饰型偏特化DataT1, T2return0;}五 模板分离编译分离编译定义就是将声明和实现拆分到不同的文件中【一般在项目工程中会将函数或者类的声明放到.h文件中对外暴露接口将函数或者类的定义放到.cpp文件中内部具体实现】优点1.方便阅读和维护2.对外只暴露接口隐藏具体实现细节注意模板特殊限制普通函数 / 普通类可以正常分离编译但类模板、函数模板不能简单分离编译 模板实例化发生在编译期若声明在.h、实现放在.cpp调用时编译器看不到模板完整实现会报链接错误。 解决模板分离编译的两种方案1.模板实现直接写在.h 头文件中2.在.cpp 末尾显式实例化需要的模板类型。四步完整编译流程C/C 编译分为 4 个独立阶段每个.cpp单独编译为目标文件.o1.预处理展开头文件、宏替换、删除注释生成.i文件2.编译语法检查翻译成汇编代码.s3.汇编汇编转机器码生成二进制目标文件.o每个 cpp 对应一个.o4.链接合并所有.o匹配函数地址生成可执行程序举例普通函数分离编译和模板分离编译举例//在Fun.h文件中声明#pragma oncevoidF1();// 仅函数声明无函数体templateclassTvoidF2(constTx);//在Fun.cpp文件中实现#define _CRT_SECURE_NO_WARNINGS1#includeFun.h#includeiostreamusing namespace std;voidF1(){coutF1()endl;}templateclassTvoidF2(constTx){coutvoid F2(const T x)endl;}//在Test.cpp文件中测试#define _CRT_SECURE_NO_WARNINGS1#includeFun.hintmain(){//F1();F2(10);//编译通过但LNK2019无法解析的外部符号 void __cdecl F2int(int const ) (??$F2HYAXAEBHZ)函数 main 中引用了该符号return0;}普通函数 F1 为什么没问题1.编译Fun.cpp时文件内直接定义void F1()编译器直接实例化出F1机器码写入Fun.o的符号表记录函数内存地址2.编译Test.cpp时只看到F1()声明语法校验通过机器码里预留call F1(?)占位3.链接阶段读取Fun.o符号表找到F1真实地址填充Test.o的占位符匹配成功模板函数 F2 为什么链接失败模板只有被调用时才会实例化不存在通用机器码1.Fun.c中只写了模板定义但本文件没有任何F2(xxx)调用编译器不会生成F2、F2等任何实例的机器码Func.o符号表里没有 F2 相关符号2.Test.cpp里执行F2(10)触发F2实例化但Test.cpp只包含Func.h只有模板声明看不到完整函数体无法生成F2机器码仅预留call F2(?)占位3.链接阶段遍历Func.o找不到F2符号抛出 LNK2019无法解析的外部符号 “void __cdecl F2(int const )” (??$F2HYAXAEBHZ)函数 main 中引用了该符号解决模板分离编译报错的 2种方案1. 模板实现全部写在.h头文件编译时能看见完整模板代码调用时直接实例化。【推荐】2.显式实例化模板实现仍放.cpp【不推荐】缺点极不灵活每新增一种调用类型就要手动加一行实例化代码如下在Func.cpp模板末尾手动写出项目中会用到的全部类型强制编译器生成对应实例机器码写入符号表 templateclassTvoidF2(constTx){coutvoid F2(const T x)endl;}// 手动实例化需要的类型templatevoidF2int(constint);templatevoidF2double(constdouble);小结模板在哪调用在哪实例化看不到完整函数体就无法生成机器码总结模板的优点1.实现了代码的复用节省资源2.增强了代码的灵活性便于代码维护模板的缺点1.当模板实例化过多会导致代码膨胀问题也会导致编译时间变长2.如果模板编译出现错误时不易定位

相关新闻

深度学习 智慧安防 基于 YOLOv8 深度学习的摔倒检测系统 摔倒检测数据集

深度学习 智慧安防 基于 YOLOv8 深度学习的摔倒检测系统 摔倒检测数据集

智慧安防-基于深度学习的摔倒检测系统】 模型:yolov8 支持:图片,视频,摄像头检测 准确率:90% 软件 anaconda和pycharm 内含600张摔倒数据集 包括[‘Down’, ‘Person’],2类 基于YOLOv8的摔倒检测系统 一、…

2026/10/10 9:16:44 阅读更多 →
HarmonyOS ArkTS 工具网格与路由导航:从小工具百宝箱看卡片式布局与页面跳转的实战技巧

HarmonyOS ArkTS 工具网格与路由导航:从小工具百宝箱看卡片式布局与页面跳转的实战技巧

引子:一个应用塞五个小工具 "工具箱"应用——把二维码生成、单位换算、随机决策、颜色提取、倒计时五个小工具集成到一个应用里。需求很简单:首页放五个卡片,点击跳转到对应工具页面。 看起来就是"画五个卡片,加个…

2026/10/7 8:37:35 阅读更多 →
基于qemu_v8+optee 4.00 平台构建 ca/ta

基于qemu_v8+optee 4.00 平台构建 ca/ta

整体工程目录test0923test0923-PC:~/workspace/optee400$ tree -L 1 . ├── build ├── buildroot ├── hafnium ├── linux ├── mbedtls ├── optee_benchmark ├── optee_client ├── optee_examples -> ../optee_examples_AG519M/ ├── optee_example…

2026/10/10 5:39:21 阅读更多 →

最新新闻

头歌MySQL实训全关卡答案解析与避坑指南

头歌MySQL实训全关卡答案解析与避坑指南

简介:这是一份头歌MySQL数据库实训的答案整理文档,面向正在完成头歌平台实训作业的学生,也适合需要系统回顾MySQL核心操作的初学者。文档以PDF格式提供,共1个文件,压缩包大小433KB,配有目录结构&#xff0c…

2026/10/12 0:30:14 阅读更多 →
OpenClaw 下一代 AI 助手框架:让 AI 拥有记忆和工具,TaoToken 统一 Key 接入实战

OpenClaw 下一代 AI 助手框架:让 AI 拥有记忆和工具,TaoToken 统一 Key 接入实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 0:30:14 阅读更多 →
身份证识别OCR实战:从图像预处理到字段解析的完整流程

身份证识别OCR实战:从图像预处理到字段解析的完整流程

简介:这是一份面向图像识别与OCR入门者的身份证识别项目实践资源,聚焦从身份证图片中自动提取身份证号及其他字段的完整实现。项目基于百度开源的PaddleOCR,针对中文识别效果做了优化,并编译了Windows可执行版本,可通过…

2026/10/12 0:30:14 阅读更多 →
Hyperf 中使用 Elasticsearch:协程化客户端封装与连接池实战指南

Hyperf 中使用 Elasticsearch:协程化客户端封装与连接池实战指南

后端Web框架微服务RPC框架异步编程 【免费下载链接】hyperf 🚀 A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease. 项目地址: https://gitcode.com/hyperf/hyperf 点击查看 免费下载 …

2026/10/12 0:30:14 阅读更多 →
指针仪表检测数据集实战:1000张图与三种标签格式的YOLO训练指南

指针仪表检测数据集实战:1000张图与三种标签格式的YOLO训练指南

简介:这份YOLO指针仪表目标检测数据集面向计算机、电子信息工程、数学等专业的学生与算法初学者,可用于课程设计、期末大作业和毕业设计中的目标检测训练与验证任务。压缩包共2000个文件,约20.25MB,包含1000张指针仪表图片&#x…

2026/10/12 0:30:14 阅读更多 →
基于深度学习的智慧教室:专注度分析与作弊检测实战

基于深度学习的智慧教室:专注度分析与作弊检测实战

简介:这份资源是面向计算机相关专业学生与项目实战学习者的智慧教室系统源码,核心围绕基于深度学习的课堂专注度分析与考试作弊检测两大功能展开,可作为毕业设计、课程设计或期末大作业的完整参考方案。压缩包共626个文件,约87.73…

2026/10/12 0:29:13 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →