【C++】非类型的模板参数,特化
目录
1.类型模板参数和非类型模板参数
2.特化
3. 模板的分离编译
4.模板的优缺点
1.类型模板参数和非类型模板参数
之前写模板传的都是类型——类型模板参数
现在想定义两个静态数组,数组长度不同,就可以用模板参数传数值而不是传类型
非类型模板参数——是一个常量,只适用于整型(int,short,char,size_t...)

那么这个静态数组可以用array,是一个固定大小的顺序表

其实可以发现他的模板参数就是有类型的也有非类型的

成员函数没有头尾插,有迭代器和范围for,他对比的是C的静态数组,并且他的数据也存在栈上
为什么可以兼容C还要搞出他?
他们对越界的检查不一样
C对越界读不检查,越界写抽查
C++的array越界读写都能查,因为重载了[ ],operator对其检查
2.特化
模板的特化,使用模板可以实现一些与类型无关的代码,但对于一些特殊的类型可能会得到错误结果
按照类型分类
- 函数模板特化
比如之前我们实现的Less,如果传的是类型指针就会比较地址,而不是解引用之后的值
我们的解决方案是自己写一个仿函数
但是有一点点挫
现在我们可以进行特化
template<class T>
bool Less( T left, T right)
{return left < right;
}template<>
bool Less<Date*>(Date* left, Date* right)
{
return *left < *right;
}
一定要注意,函数模板特化,一定要有函数模板,然后才是针对某些类型的特殊处理(用函数模板特化) ,只有特化是会报错的,因为一般类型没有处理

注意参数列表的统一,说的通俗一些,特化就是特殊处理,但是本质不应该改变
第一个Less是对引用的比较,但是第二个Less突然变成了对“值”的比较

应该写成

当然对于函数模板特化,这个类型匹配非常恶心,建议还是直接写成重载

- 类模板特化
和刚才的规则一样
假设我们对A类的<int,int> 类型特化
template<class T1, class T2>
class A
{
public:A(){cout << "A<T1, T2>" << endl;}
private:T1 _a1;T2 _a2;
};template<>
class A<int, int>
{
public:A(){cout << "A<int, int>" << endl;}
private:int _a1;int _a2;
};
调用结果:

按照特化程度分类:
- 全特化
全部参数特化
还是上面那个例子,只对<int,int>类型特化,<int,X>不可以,<X,int>也不可以

- 偏特化 /半特化
部分参数特化,是对参数类型的进一步限制
只要类型是<X,char>就匹配
template<class T1, class T2>
class A
{
public:A(){cout << "A<T1, T2>" << endl;}
private:T1 _a1;T2 _a2;
};
template<class T>
class A<T, char>
{
public:A(){cout << "A<int, int>" << endl;}
private:T _a1;char _a2;
};
优先级总结

a1可以三种都可以匹配,但是他选择全特化
a2可以匹配半特化和类模板,他选择前者
最后一个没有选择
特化本质:编译器的参数匹配原则
3. 模板的分离编译
定义:一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译,生成目标文件,最后将所有的目标文件链接在一起,形成单一的可执行文件的过程


无法解析的外部符号就是链接错误,因为在编译的时候会生成符号表,把语言级别的代码变成汇编语言,然后汇编形成可重定位的目标二进制文件(.obj),最后链接自己形成的几个.obj然后生成可执行程序
在函数定义中,无法确定T的类型,故没有实例化
在函数模板调用中,没有函数实现,还是没办法实例化
因此最后这个函数模板没有实例化,无法生成符号,链接时自然找不到
解决方法:声明和定义都写在.h/.hpp中
4.模板的优缺点
- 优点:模板复用了代码,节约资源,更快迭代开发,增强代码灵活性
- 缺点:导致代码膨胀,编译时间变长,出现模板编译错误时,报错信息混乱,不易定位错误
相关文章:
【C++】非类型的模板参数,特化
目录 1.类型模板参数和非类型模板参数 2.特化 3. 模板的分离编译 4.模板的优缺点 1.类型模板参数和非类型模板参数 之前写模板传的都是类型——类型模板参数 现在想定义两个静态数组,数组长度不同,就可以用模板参数传数值而不是传类型 非类型模板…...
核方法(kernel Method)
核方法 核方法定义 一种能够将在原始数据空间中的非线性数据映射到高维线性可分的方法。 核方法的用处 1、低维数据非线性,当其映射到高维空间(feature space)时,可以用线性方法对数据进行处理。 2、线性学习器相对于非线性学…...
消息队列MQ用来做什么的,市场上主流的四大MQ如何选择?RabbitMQ带你HelloWorld!
文章目录MQ用来做什么的MQ会有什么样的麻烦MQ消息队列模式分类MQ消息队列常用协议市场主流四大MQRabbitMQ项目开发RabbitMQ中的组成部分MQ用来做什么的 省流 :系统解耦、异步调用、流量削峰 系统解耦 首先举例下面这个场景,现有ABCDE五个系统ÿ…...
2023年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(同步赛) A — E
2023年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(同步赛) 文章目录A -- A Xor B Problem题目分析codeB -- 吃苹果题目分析codeC -- n皇后问题题目分析codeD -- 分苹果题目分析codeE -- 完型填空题目分析codeA – A…...
一文分析Linux v4l2框架
说明: Kernel版本:4.14 ARM64处理器,Contex-A53,双核 使用工具:Source Insight 3.5, Visio 1. 概述 V4L2(Video for Linux 2):Linux内核中关于视频设备驱动的框架,对上向应用层提供…...
MFC常用控件使用(文本框、编辑框、下拉框、列表控件、树控件)
简介 本文章主要介绍下MFC常用控件的使用,包括静态文本框(Static Text)、编辑框(Edit Control)、下拉框(Combo Box)、列表控件(List Control)、树控件(Tree Control)的使用。 创建项目 我们选择 文件->新建->新建项目,选择MFC程序 选择基于对话…...
13 node 程序后台执行加上 tail 命令, 中断 tail 命令, 同时也中断了 node 程序
前言 呵呵 最近帮朋友解决问题[2022.09.08] 需要启动一个 node 程序, 然后 需要一个 startUp.sh 脚本 然后 反手写了一个过去, 按道理 来说 应该是 后台启动了对应的 node 程序, 然后将 标准输出, 错误输出 输出到 logs/nohup.log 日志文件中, 然后基于 tail 命令 来查看 …...
52癫痫发作预测的有效双自注意力残差网络
Effective dual self-attentional residual networks for epileptic seizure prediction 摘要 癫痫发作预测作为慢性脑疾病中最具挑战性的数据分析任务之一,引起了众多研究者的广泛关注。癫痫发作预测,可以在许多方面大大提高患者的生活质量࿰…...
【计算机网络】Tcp IP 面试题相关
互联网协议群(TCP/IP):多路复用是怎么回事? 1.【问题】IPv4 和 IPv6 有什么区别? IPv4 是用 32 位描述 IP 地址,理论极限约在 40 亿 IP 地址; IPv6 是用 128 位描述 IP 地址,IPv6 可…...
【MySQL】MySQL的存储引擎
目录 概念 分类 操作 概念 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查 询、更新和删除数据。 不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。现在 许多不同的数据库管理系统…...
es6动态模块import()
目录 一、语法说明 二、适用场合 三、注意点 四、示例代码 五、效果 一、语法说明 import命令会被 JavaScript 引擎静态分析,先于模块内的其他语句执行(import命令叫做“连接” binding 其实更合适)。 // 报错 if (x 2) {import MyMod…...
【Flask】Jinja2模板(十四)
Jinja2是一个单独的Python包,Flask依赖Jinja2,安装Flask时会自动安装Jinja2。Jinja2可以将数据和模板结合在一起生成动态文本。 一、引入 来看一个最简单的视图函数: app.route(/) def hello_world():return Hello World! 这个…...
Mr. Cappuccino的第49杯咖啡——冒泡APP(升级版)之基于Docker部署Gitlab
冒泡APP(升级版)之基于Docker部署Gitlab基于Docker安装Gitlab登录Gitlab创建Git项目上传代码使用Git命令切换Git地址使用IDE更换Git地址基于Docker安装Gitlab 查看beginor/gitlab-ce镜像版本 下载指定版本的镜像 docker pull beginor/gitlab-ce:11.3.0…...
《机器学习》基础概念之【P问题】与【NP问题】
《机器学习》基础概念之【P问题】与【NP问题】 这里写目录标题《机器学习》基础概念之【P问题】与【NP问题】一、多项式&时间复杂度1.1. 多项式1.2.时间复杂度二、P问题 & NP问题2.1. P问题2.2.NP问题2.3.举例理解NP问题-TSP旅行商推销问题三、NP-hard问题&NP-C问题…...
WinRAR安装教程
文章目录WinRAR安装教程无广告1. 下载2. 安装3. 注册4. 去广告WinRAR安装教程无广告 1. 下载 国内官网:https://www.winrar.com.cn/ 2. 安装 双击,使用默认路径: 点击“安装”。 点击“确定”。 点击“完成”。 3. 注册 链接ÿ…...
C++:vector和list的迭代器区别和常见迭代器失效问题
迭代器常见问题的汇总vector迭代器和list迭代器的使用vector迭代器list迭代器vector迭代器失效问题list迭代器失效问题vector和list的区别vector迭代器和list迭代器的使用 学习C,使用迭代器和了解迭代器失效的原因是每个初学者都需要掌握的,接下来我们就…...
SpringSecurity如何实现前后端分离
前后端分离模式是指由前端控制页面路由,后端接口也不再返回html数据,而是直接返回业务数据,数据一般是JSON格式。Spring Security默认的表单登录方式,在未登录或登录成功时会发起页面重定向,在提交登录数据时ÿ…...
为ubuntu 18.04添加蓝牙驱动
目录背景方法背景 从网上买的能直接插ubuntu 1804的usb蓝牙太少了,而且还贵。我就直接从JD下单的一个便宜的USB蓝牙,结果插上机器没有驱动起不来。我的PC是个3年前的老机器,实在是不想升级系统,于是捣鼓半天捣鼓好了,…...
Stable Diffusion Prompt用法
Stable Diffusion可以根据你输入的提示词(prompt)来绘制出想象中的画面。 1、正向提示词(Prompt): 提高图像质量的prompt: prompt用途HDR, UHD, 64K(HDR、UHD、4K、8K和64K)这样的质量词可以带来巨大的差异提升照片…...
jenkins问题
目录 python 不是内部或外部命令,也不是可运行的程序 ‘cmd’ 不是内部或外部命令,也不是可运行的程序或批处理文件。 git 不是内部或外部命令,也不是可运行的程序或批处理文件。 pywintypes.com_error: (-2147024891, ‘拒绝访问。’, None,…...
ClawSuite:模块化网络安全工具集的设计原理与实战应用
1. 项目概述:ClawSuite,一个被低估的网络安全工具集如果你在网络安全领域摸爬滚打过几年,尤其是做过渗透测试或者红队评估,那你肯定对Metasploit、Nmap、Burp Suite这些名字如数家珍。但今天我想聊一个在GitHub上相对低调…...
Elasticsearch 查询日志:每个查询一行协调器级别日志,适用于 ES|QL、DSL、SQL 和 EQL
作者:来自 Elastic Najwa Harif 及 Valentin Crettaz 通过 Elasticsearch 查询日志,可以轻松理解查询对集群性能的影响。每个请求由一条协调器级别日志记录,覆盖 ES|QL、DSL、SQL 和 EQL,并提供完整的查询文本、追踪信息、可选用户…...
QT实战:利用QAxObject与QAxWidget实现Office文档自动化,从数据填充到格式定制
1. 为什么需要Office文档自动化? 在企业日常运营中,文档处理是绕不开的环节。我见过太多同事每天花几个小时手动复制粘贴数据到Word报告和Excel表格里,不仅效率低下,还容易出错。想象一下,财务部门每月要生成上百份报…...
NotebookLM笔记生产力跃迁(仅限前500名早鸟用户的动态模板库已开放)
更多请点击: https://intelliparadigm.com 第一章:NotebookLM笔记生产力跃迁(仅限前500名早鸟用户的动态模板库已开放) NotebookLM 正式引入基于语义理解的「上下文感知模板引擎」,早鸟用户可通过专属入口启用动态模板…...
从AWE Designer到独立声卡:awb二进制文件固化Flash的实战解析
1. 从AWE Designer到独立声卡的核心逻辑 第一次接触AWE Designer的朋友可能会疑惑:为什么要把算法从PC端搬到开发板?简单来说,这就好比把厨师做好的预制菜打包成罐头——让美味脱离厨房环境也能随时享用。AWE Designer原本需要依赖电脑实时运…...
Lie群方法在机器人状态估计中的创新应用
1. 状态估计技术演进与Lie群方法的核心价值在机器人导航与定位领域,状态估计技术扮演着大脑的角色。想象一下,当你在陌生城市使用手机导航时,系统需要实时融合GPS、陀螺仪和加速度计的数据来确定你的位置——这正是状态估计的典型应用场景。传…...
如何在PC上快速配置yuzu模拟器:完整游戏体验指南
如何在PC上快速配置yuzu模拟器:完整游戏体验指南 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu 想在电脑上畅玩任天堂Switch游戏吗?yuzu模拟器是你的最佳选择!作为目前最成熟的…...
从数据焦虑到数字资产:WeChatExporter如何重塑你的微信记忆管理
从数据焦虑到数字资产:WeChatExporter如何重塑你的微信记忆管理 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因手机存储空间不足而不得不删除珍贵…...
工业物联网协议选型实战:从MQTT、DDS到CoAP的架构设计指南
1. 工业物联网数据连接协议全景解析在工业物联网这个领域摸爬滚打了十几年,我越来越深刻地体会到,一个项目的成败,往往在技术选型的起点上就埋下了伏笔。尤其是在数据连接协议的选择上,这绝不是简单地挑一个“最流行”或者“最新”…...
【Midjourney Tempera风格终极指南】:20年AI绘画专家亲授3大参数黄金配比与5类易踩翻车点
更多请点击: https://intelliparadigm.com 第一章:Tempera风格的本质解构与历史溯源 Tempera(蛋彩画)作为一种古老而精密的绘画媒介,其技术逻辑与现代前端渲染范式存在深层隐喻关联——尤其在“分层合成”“介质绑定”…...
