C++---模板进阶
非类型模板参数/* * 一: 非类型模板参数 * 1. 内存中栈的大小大约是8M约800W字节(按数量级估计而来) * 注1G 1024MB 1024 * 1024KB 1024 * 1024 * 1024Byte(字节) * * 由于栈区的大小有限如果开辟的空间过大的话可能会引发栈溢出的问题就像递归层次过深也会导致栈溢出 * 所以使用非类型模板参数的时候要注意不要开太大的空间 * * 2.#define N 10这种方式无法支持多个不同大小的静态数组同时出现所以要加一个非类型模板参数 * * #define N 10 * * templateclass T * class Stack * { * private: * T _a[N]; * size_t _size; * size_t _capacity; * }; * * Stackint st1;//st1和st2都只能是10个T的_a[10]数组 * Stackint st2; * * 3.模板参数跟函数参数一样可以给缺省参数规则一样唯一注意的就是全缺省定义对象的时候 * //如果Stack是全缺省参数模板那定义的时候可以不传任何参数不传任何参数的时候按照如下方式定义 * Stack st3; * * 注意非类型模板参数只能传常数 */ templateclass T, size_t N class Stack { private: T _a[N]; size_t _size; size_t _capacity; }; int main() { Stackint, 10 st1; Stackint, 100 st2; return 0; }容器array和普通静态数组/* * array容器静态数组用的就是非类型模板参数 * array跟int a[10]这种的唯一区别就在于array有严格的越界检查 * 普通的数组只是一种抽查(且只对越界写抽查抽查的是结束邻近位置越界读不检查) * * 由于非类型模板参数只能传常数因此array不支持变长数组 */ int main() { arrayint, 10 arr; int a[10]; arr[0] 100;//arr.operator[](0) arr[9] 100; a[0] 100;//*(a 0) for (auto e : arr) { cout e ; } cout endl; //二维数组 arrayarrayint, 5, 10 arr2;//10个array数组每个array大小为5 return 0; }容器数组跟vector的区别就是一个是静态开辟空间一个是动态开辟空间在栈上开辟效率比在堆上开要快一点但是不能搞太大可能会导致栈溢出。模板特化函数模板特化特化的核心是指定具体类型然后完全重新编写函数逻辑不需要和原模板函数的实现一致甚至可以完全改变功能虽然不推荐这么做违背模板的设计初衷。注函数模板尽量都搞成引用因为传内置类型加不加引用区别不大如果是传自定义类型传值传参那就会有深拷贝效率就低了所以都要加上引用。//templateclass T //bool Less(T x, T y) //{ // return x y; //} // ////特化 //template //bool Lessdouble*(double* x, double* y) //{ // return *x *y; //} // //int main() //{ // double* dou1 new double(2.2); // double* dou2 new double(1.1); // // cout Less(dou1, dou2) endl;//调用特化的函数 // // return 0; //} //加上引用才是面试官爱看的代码 templateclass T bool Less(const T x, const T y)//const修饰的是引用的内容 { return x y; } //特化有问题---主要是const修饰的位置有问题 //const修饰的是*是修饰x和y指向的内容而模板里边修饰的是x和y本身才对特化要跟模板一致 //template //bool Lessconst double*(const double* x, const double* y) //{ // return *x *y; //} /* * const在*的左边修饰的是*data * 在右边修饰的是data * const T* data * T const * data * T * const data */ //注像下边这种时候直接写函数实例不用特化能规避错误 //因为只要有实例编译器就不会再去自己实例化了 //有现成吃现成 template bool Lessdouble*(double* const x, double* const y) { return *x *y; } int main() { double* dou1 new double(2.2); double* dou2 new double(1.1); cout Less(dou1, dou2) endl;//调用特化的函数 return 0; }类模板特化全特化为特定类型完全重新定义整个类原模板的成员变量、成员函数都不会被保留特化类里写了哪些成员就有哪些和原模板无关。偏特化为部分类型定制类同样是重新定义类的成员无需和原模板一致但如果是 “类模板成员函数的特化”而非类本身特化则仅该成员函数被重新实现其他成员仍沿用原模板。templateclass T1, class T2 class Data { public: Data() { cout Data(T1, T2) endl; } private: T1 _a; T2 _b; }; //全特化---所有的类型全部确定 //全特化没有偏特化灵活它的类型已经全部确定了 template class Dataint, int { public: Data() { cout Data(int, int) endl; } }; //偏特化---特化部分参数(类型显示特化出来) //其他原模板参数保留 templateclass T1 class DataT1, int { public: Data() { cout Data(T1, int) endl; } }; //偏特化---对参数进行进一步限制 //任意指针类型都可以匹配到这个特化Data类 templateclass T1, class T2 class DataT1*, T2* { public: Data() { cout Data(T1*, T2*) endl; } //T1和T2的类型还是原来的假如传过来是char*, char*则T1类型是charT1*类型是char* void f1() { T1 x1; cout typeid(x1).name() endl; T1* x2; cout typeid(x2).name() endl; } }; templateclass T1, class T2 class DataT1, T2 { public: Data() { cout DataT1, T2 endl; } void f1() { T1 x1; cout typeid(x1).name() endl; T1* x2; cout typeid(x2).name() endl; } }; templateclass T1, class T2 class DataT1*, T2 { public: Data() { cout DataT1*, T2 endl; } void f1() { T1 x1; cout typeid(x1).name() endl; T1* x2; cout typeid(x2).name() endl; } }; //仿函数/函数对象 //在priority_queue里边仿函数实现的是比较大小逻辑 //当模板参数是指针类型的时候默认就是按指针进行比较 //但我们期望是按照指针指向的内容去比较的时候就需要自己写一个仿函数传过去 //也可以直接用模板特化去解决 //全特化跟偏特化可以同时存在 templateclass T class Less { public: bool operator()(const T x, const T y) { return x y; } }; // 偏特化 templateclass T class LessT* { public: bool operator()(T* const x, T* const y) { return *x *y; } }; //全特化 //一定记住全特化就是全部的参数都知道具体类型了 //对于char*来说就想让它按指针进行比较 //就可以单独写一个全特化的Less template class Lesschar* { public: bool operator()(char* const x, char* const y) { return x y; } };模板分离编译模板定义与声明分离会有链接错误因为模板声明与定义分离之后定义和调用一个在test2.cpp一个在test3.cpp。test2文件里不知道模板参数具体调用的时候是什么类型就没法实例化导致链接的时候找不到地址。(编译的时候转化成call地址)。解决方案一显示实例化test2.h#includeiostream using namespace std; templateclass T void FuncT(const T x);test2.cpp#includetest2.h templateclass T void FuncT(const T x) { cout FuncT endl; } //显示实例化(没人用) //加template就是告诉编译器下边这个是模板的实例 template void FuncT(const int x); template void FuncT(const double x);test3.cpp#includetest2.h int main() { //调用的时候传什么参数显示实例化就要写什么参数太麻烦了 FuncT(1);//call FuncT(?) FuncT(1.1) return 0; }解决方案二声明跟定义分离在一个文件里(.h文件)写在同一个文件里预处理的时候就会将.h里边的东西全部包含到.cpp里边那不就相当于全部写在一个文件里了编译时直接实例化出函数模板生成地址FuncT(1)调用函数的时候就不需要去链接了直接call到了函数的地址直接调用。注类模板同理类模板里的成员变量本来就只是声明要分离的也只是里边的成员函数那解决方式跟函数模板一样。(下边只是演示一下类模板是怎么声明和定义分离的但其实下边会有链接问题).htemplateclass T class Stack { public: Stack(const T x); private: T* _a; size_t _size; size_t _capacity; };.cpp#includetest2.h templateclass T StackT::Stack(const T x) { cout Stack() endl; }

相关新闻

AI副业复购率提升速成课:7天部署可落地的RFM-AI动态召回模型(含Python+Notion模板)

AI副业复购率提升速成课:7天部署可落地的RFM-AI动态召回模型(含Python+Notion模板)

更多请点击: https://codechina.net 第一章:AI副业复购率提升的核心逻辑与商业价值 在AI驱动的副业生态中,复购率并非单纯依赖价格优惠或促销刺激,而是由“价值闭环强度”决定——即用户首次体验→问题被精准解决→持续获得增量收…

2026/7/28 2:07:03阅读更多 →
静态文档网站:Docsify、GitBook、Docmd

静态文档网站:Docsify、GitBook、Docmd

Docsify 官网,开源(GitHub,31.4K Star,5.8K Fork)文档网站生成器,不会生成静态HTML文件。通过轻量级JS引擎,在运行时直接动态加载并解析Markdown文件。 设计理念: 无需静态构建&a…

2026/7/28 2:05:03阅读更多 →
摄像头sc233hgs驱动 v4l2驱动层设置参数方法

摄像头sc233hgs驱动 v4l2驱动层设置参数方法

主要是下面的几个接口: v4l2_ctrl_new_std v4l2_ctrl_new_int_menu v4l2_ctrl_new_std_menu_items 这三个接口都属于 Linux V4L2(Video for Linux 2)驱动开发中的控制项创建函数,用于为 V4L2 设备(如摄像头、视频采集卡…

2026/7/28 2:05:03阅读更多 →
Arduino无源蜂鸣器驱动指南:从tone()函数到音乐与音效实战

Arduino无源蜂鸣器驱动指南:从tone()函数到音乐与音效实战

1. 从“哔哔”声到旋律:认识你的第一个发声元件如果你玩过任何会发出提示音的电子设备,比如微波炉、洗衣机或者老式的电子贺卡,那么你大概率已经听过蜂鸣器的声音了。在Arduino的世界里,蜂鸣器(Buzzer)可以…

2026/7/28 4:51:33阅读更多 →
计算机毕业设计选题推荐:5个Spring Boot企业级项目(2026·含论文源码)

计算机毕业设计选题推荐:5个Spring Boot企业级项目(2026·含论文源码)

Spring Boot是毕设最主流的后端框架。我整理了5个Spring Boot方向的企业级毕业设计项目,每个都配完整论文源码答辩PPT,覆盖人事、科研、充电桩、公租房等真实业务场景。1. 企业人事管理系统 技术栈:Spring Boot Vue MySQL难度:★…

2026/7/28 4:51:33阅读更多 →
如何用League Akari实现英雄联盟自动化:完整技术解析与实战指南

如何用League Akari实现英雄联盟自动化:完整技术解析与实战指南

如何用League Akari实现英雄联盟自动化:完整技术解析与实战指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari是一款…

2026/7/28 4:51:33阅读更多 →
计算机毕业设计选题推荐:2026年5个SSM框架项目(SSM+论文+源码)

计算机毕业设计选题推荐:2026年5个SSM框架项目(SSM+论文+源码)

大三/大四,不知道毕设做什么?我整理了5个SSM框架方向的毕业设计项目,每个都配 SSM 完整论文 答辩PPT 源码。1. 零食商城 技术栈:SSM MySQL难度:★★☆适合:计科、软工,电商方向做什么&#…

2026/7/28 4:51:33阅读更多 →
智能学术助手助力专科生高效完成论文开题

智能学术助手助力专科生高效完成论文开题

1. 项目概述:当开题遇上专科生的困境第一次写学术论文的专科生往往会在开题阶段就陷入迷茫。与本科生不同,专科教育更侧重职业技能培养,学生在学术规范、文献检索、研究设计等方面普遍缺乏系统训练。我见过太多专科同学面对空白的Word文档发呆…

2026/7/28 4:51:33阅读更多 →
AI前沿技术日更简报:高效信息聚合与智能推荐实践

AI前沿技术日更简报:高效信息聚合与智能推荐实践

1. 项目概述:AI前沿技术日更简报的价值与定位每天清晨打开邮箱就能获取AI领域最新技术动态,这可能是许多从业者梦寐以求的信息获取方式。"AI前沿技术日更简报"正是为解决这一需求而生。不同于传统周报或月刊,这种高频次、高密度的信…

2026/7/28 4:49:33阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:29阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/27 16:57:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →