深入探索 C++ 模板进阶特性:从类型参数到特化机制--《Hello C++ Wrold!》(12)--(C/C++)

深入探索 C++ 模板进阶特性:从类型参数到特化机制--《Hello C++ Wrold!》(12)--(C/C++)

文章目录

前言

在 C++ 编程中,模板作为泛型编程的核心机制,不仅支持基础的类型参数化,还包含诸多进阶特性,这些特性是理解 STL 底层实现与复杂模板编程的关键。从typename与class的微妙差异,到非类型模板参数的编译期常量特性,再到模板特化的灵活应用,掌握这些知识能让你突破模板编程的瓶颈,深入理解 C++ 类型系统的强大表现力。

本章节将系统解析模板编程中的进阶概念:首先探讨typename在嵌套类型解析中的关键作用,明确其与class的本质区别;接着介绍非类型模板参数如何实现编译期配置,以及其在数组长度、缓冲区大小等场景中的应用;然后深入模板特化技术,通过函数模板特化与类模板的全特化 / 偏特化案例,展示如何针对特殊类型定制化实现;最后分析模板分离编译的困境与解决方案,理解模板实例化的编译期特性。

无论是解决模板编译错误时的困惑,还是优化复杂模板代码的性能,这些进阶知识都将成为你的有力工具。通过本章内容,你将从 “使用模板” 进阶到 “理解模板实现原理”,为深入 STL 源码阅读、模板元编程等高级主题奠定坚实基础。让我们一起揭开模板进阶特性的神秘面纱,感受 C++ 类型系统的精妙设计!

typename和class的唯一区别

在用类模板里面的类型(也就是嵌套类型)时,前面要加上typename或者在刚开始的类型形参那就用typename才行
在这里插入图片描述
原因:编译器不知道T::NestedType是静态成员变量还是类型,需要用typename来表示一下

非类型模板参数

模板参数分类类型形参与非类型形参。

类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。

非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用

但是非类型形参是有要求的:

1.必须要是整型的形参才行(比如:size_tint)

2.这个形参必须是常量(在编译期间就能确定的),传参时必须直接传常数过去(在模板里面也不能对其改动)

模板的特化

概念:在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。模板特化中分为函数模板特化与类模板特化

注意:必须要有主模板之后才能对模板进行特化

函数模板的特化

其实,函数模板特化的话,最好用重载那种方式替代

注意,特化后的函数形参表必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误(而且函数模板还不让偏特化)
template<class T> bool Less(T left, T right) { return left < right; } 函数模板的特化 template<> bool Less<int*>(int* left, int* right) { return *left < *right; } //注意写法:1.关键字template后面接一对空的尖括号<> // 2.函数名后跟一对尖括号,尖括号中指定需要特化的类型 但是,一般都是用函数重载来替代函数模板的特化的 eg:bool Less(int* left, int* right) { return *left < *right; } 引申:template<class T> bool Less(T* left, T* right) { return *left < *right; }这要搞的话,传入的参数就只能是指针(传入的是int*,那么T就是int这样) 

类模板的特化

类模板的特化分为全特化和偏特化

全特化

概念:将模板参数列表中所有的参数都确定。

偏特化

概念:部分特化或者对形参的类型做出进一步的限制(比如:T*,T&这样)

模板分离编译

这里的分离是指的不在同一个文件里面

由于模板的实例化是在编译阶段,所以,如果把声明放在.h文件,定义放在另一个.cpp文件的话),是不会去实例化的,就会出错

解决方法1.将声明和定义放到一个文件 “xxx.hpp” 里面或者xxx.h里面

模板总结

优点:

1.模板复用了代码,节省资源,更快的迭代开发,STL因此而产生

2.增强了代码的灵活性

【缺陷】

1.模板会导致代码膨胀问题,也会导致编译时间变长

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

Read more

分层可导航小世界算法(HNSW)

分层可导航小世界算法(HNSW) 引言 随着大语言模型(LLM)与检索增强生成(RAG)技术的普及与应用,向量数据库的热度持续攀升。当前主流的向量数据库(如 Milvus、Weaviate、Chroma、Elasticsearch 等)均支持 HNSW 这一高效的向量检索算法。本文将对 HNSW 算法的起源进行学习及探讨 更好的排版格式~ 传送门 正则图和随机图 在介绍 NSW 和 HNSW 之前,我们先来了解一下正则图和随机图的概念,这对于理解为什么 HNSW 能够加快向量检索效率是很有帮助的 正则图(Regular Graph) 正则图是指各顶点的度均相同的无向简单图。在图论中,正则图中每个顶点具有相同数量的邻点,若每个顶点的度均为k,称为k-正则图 随机图(Random graph) 随机图是指由随机过程产生的图,一个随机图实际上是将给定的顶点之间随机地连上边 正则图 vs 随机图

By Ne0inhk
我的算法修炼之路--8——预处理、滑窗优化、前缀和哈希同余,线性dp,图+并查集与逆向图

我的算法修炼之路--8——预处理、滑窗优化、前缀和哈希同余,线性dp,图+并查集与逆向图

💗博主介绍:计算机专业的一枚大学生 来自重庆 @燃于AC之乐✌专注于C++技术栈,算法,竞赛领域,技术学习和项目实战✌💗 💗根据博主的学习进度更新(可能不及时) 💗后续更新主要内容:C语言,数据结构,C++、linux(系统编程和网络编程)、MySQL、Redis、QT、Python、Git、爬虫、数据可视化、小程序、AI大模型接入,C++实战项目与学习分享。 👇🏻 精彩专栏 推荐订阅👇🏻 点击进入🌌作者专栏🌌: Linux系统编程✅ 算法画解 ✅ C++ ✅ 🌟算法相关题目点击即可进入实操🌟 感兴趣的可以先收藏起来,请多多支持,还有大家有相关问题都可以给我留言咨询,希望希望共同交流心得,一起进步,你我陪伴,学习路上不孤单! 文章目录 * 前言 * 题目清单 * 1.寻宝 * 2.村村通

By Ne0inhk
从树到森林——决策树、随机森林与可解释性博弈

从树到森林——决策树、随机森林与可解释性博弈

从树到森林——决策树、随机森林与可解释性博弈 “如果你不能向酒吧侍者解释清楚你的模型,那你可能还没真正理解它。” 而决策树,正是那个既能讲清道理,又能打胜仗的算法。 一、为什么需要树模型? 线性模型优雅、透明,但它有一个致命假设:特征与目标之间是线性关系。 现实世界却充满非线性、交互效应和分段规则: * “如果年龄 > 60 且 血压 > 140,则高风险”; * “当用户点击过广告 A 且未购买,则推送优惠券 B”。 这些条件判断天然适合用“树”来表达。 🎯 本章目标:理解决策树如何通过“提问”进行预测;掌握信息增益、基尼不纯度等分裂准则;实现一棵简单的决策树;理解集成思想:从单棵树到随机森林;辩证看待“可解释性”:树真的那么透明吗? 二、决策树:用问答游戏做预测 1. 直觉:像玩“

By Ne0inhk
【嵌入式】直流无刷电机FOC控制算法全解析

【嵌入式】直流无刷电机FOC控制算法全解析

【嵌入式】直流无刷电机FOC控制算法全解析——原理、代码与实战 文章目录 * 【嵌入式】直流无刷电机FOC控制算法全解析——原理、代码与实战 * 引言 * 一、电机基础:从结构到控制原理铺垫 * 1. 无刷电机核心构成与优势 * 2. BLDC与PMSM的核心区别 * 3. 传统控制与FOC的本质差异 * 二、FOC核心原理:从坐标系变换到SVPWM实现 * 1. FOC算法整体框架(流程图) * 2. 核心坐标变换:从三相到两相的降维魔法 * (1)Clarke变换:静止坐标系降维 * (2)Park变换:静止到旋转的解耦 * 3. SVPWM:空间矢量的脉冲合成 * (1)基本电压矢量与扇区划分 * (2)扇区判断逻辑 * (3)矢量作用时间计算 * (4)PWM占空比生成 * 三、硬件与软件实战:STM32F103实现FOC控制 * 1. 硬件系统架构(

By Ne0inhk