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

【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.类型模板参数和非类型模板参数 之前写模板传的都是类型——类型模板参数 现在想定义两个静态数组&#xff0c;数组长度不同&#xff0c;就可以用模板参数传数值而不是传类型 非类型模板…...

核方法(kernel Method)

核方法 核方法定义 一种能够将在原始数据空间中的非线性数据映射到高维线性可分的方法。 核方法的用处 1、低维数据非线性&#xff0c;当其映射到高维空间&#xff08;feature space&#xff09;时&#xff0c;可以用线性方法对数据进行处理。 2、线性学习器相对于非线性学…...

消息队列MQ用来做什么的,市场上主流的四大MQ如何选择?RabbitMQ带你HelloWorld!

文章目录MQ用来做什么的MQ会有什么样的麻烦MQ消息队列模式分类MQ消息队列常用协议市场主流四大MQRabbitMQ项目开发RabbitMQ中的组成部分MQ用来做什么的 省流 &#xff1a;系统解耦、异步调用、流量削峰 系统解耦 首先举例下面这个场景&#xff0c;现有ABCDE五个系统&#xff…...

2023年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(同步赛) A — E

2023年中国高校计算机大赛-团队程序设计天梯赛&#xff08;GPLT&#xff09;上海理工大学校内选拔赛&#xff08;同步赛) 文章目录A -- A Xor B Problem题目分析codeB -- 吃苹果题目分析codeC -- n皇后问题题目分析codeD -- 分苹果题目分析codeE -- 完型填空题目分析codeA – A…...

一文分析Linux v4l2框架

说明&#xff1a; Kernel版本&#xff1a;4.14 ARM64处理器&#xff0c;Contex-A53&#xff0c;双核 使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 V4L2(Video for Linux 2)&#xff1a;Linux内核中关于视频设备驱动的框架&#xff0c;对上向应用层提供…...

MFC常用控件使用(文本框、编辑框、下拉框、列表控件、树控件)

简介 本文章主要介绍下MFC常用控件的使用&#xff0c;包括静态文本框(Static Text)、编辑框(Edit Control)、下拉框(Combo Box)、列表控件(List Control)、树控件(Tree Control)的使用。 创建项目 我们选择 文件->新建->新建项目&#xff0c;选择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 摘要 癫痫发作预测作为慢性脑疾病中最具挑战性的数据分析任务之一&#xff0c;引起了众多研究者的广泛关注。癫痫发作预测&#xff0c;可以在许多方面大大提高患者的生活质量&#xff0…...

【计算机网络】Tcp IP 面试题相关

互联网协议群&#xff08;TCP/IP&#xff09;&#xff1a;多路复用是怎么回事&#xff1f; 1.【问题】IPv4 和 IPv6 有什么区别&#xff1f; IPv4 是用 32 位描述 IP 地址&#xff0c;理论极限约在 40 亿 IP 地址&#xff1b; IPv6 是用 128 位描述 IP 地址&#xff0c;IPv6 可…...

【MySQL】MySQL的存储引擎

目录 概念 分类 操作 概念 数据库存储引擎是数据库底层软件组织&#xff0c;数据库管理系统&#xff08;DBMS&#xff09;使用数据引擎进行创建、查 询、更新和删除数据。 不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。现在 许多不同的数据库管理系统…...

es6动态模块import()

目录 一、语法说明 二、适用场合 三、注意点 四、示例代码 五、效果 一、语法说明 import命令会被 JavaScript 引擎静态分析&#xff0c;先于模块内的其他语句执行&#xff08;import命令叫做“连接” binding 其实更合适&#xff09;。 // 报错 if (x 2) {import MyMod…...

【Flask】Jinja2模板(十四)

Jinja2是一个单独的Python包&#xff0c;Flask依赖Jinja2&#xff0c;安装Flask时会自动安装Jinja2。Jinja2可以将数据和模板结合在一起生成动态文本。 一、引入 来看一个最简单的视图函数&#xff1a; app.route(/) def hello_world():return Hello World&#xff01; 这个…...

Mr. Cappuccino的第49杯咖啡——冒泡APP(升级版)之基于Docker部署Gitlab

冒泡APP&#xff08;升级版&#xff09;之基于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. 下载 国内官网&#xff1a;https://www.winrar.com.cn/ 2. 安装 双击&#xff0c;使用默认路径&#xff1a; 点击“安装”。 点击“确定”。 点击“完成”。 3. 注册 链接&#xff…...

C++:vector和list的迭代器区别和常见迭代器失效问题

迭代器常见问题的汇总vector迭代器和list迭代器的使用vector迭代器list迭代器vector迭代器失效问题list迭代器失效问题vector和list的区别vector迭代器和list迭代器的使用 学习C&#xff0c;使用迭代器和了解迭代器失效的原因是每个初学者都需要掌握的&#xff0c;接下来我们就…...

SpringSecurity如何实现前后端分离

前后端分离模式是指由前端控制页面路由&#xff0c;后端接口也不再返回html数据&#xff0c;而是直接返回业务数据&#xff0c;数据一般是JSON格式。Spring Security默认的表单登录方式&#xff0c;在未登录或登录成功时会发起页面重定向&#xff0c;在提交登录数据时&#xff…...

为ubuntu 18.04添加蓝牙驱动

目录背景方法背景 从网上买的能直接插ubuntu 1804的usb蓝牙太少了&#xff0c;而且还贵。我就直接从JD下单的一个便宜的USB蓝牙&#xff0c;结果插上机器没有驱动起不来。我的PC是个3年前的老机器&#xff0c;实在是不想升级系统&#xff0c;于是捣鼓半天捣鼓好了&#xff0c;…...

Stable Diffusion Prompt用法

Stable Diffusion可以根据你输入的提示词&#xff08;prompt&#xff09;来绘制出想象中的画面。 1、正向提示词&#xff08;Prompt&#xff09;&#xff1a; 提高图像质量的prompt: prompt用途HDR, UHD, 64K(HDR、UHD、4K、8K和64K)这样的质量词可以带来巨大的差异提升照片…...

jenkins问题

目录 python 不是内部或外部命令&#xff0c;也不是可运行的程序 ‘cmd’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 git 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 pywintypes.com_error: (-2147024891, ‘拒绝访问。’, None,…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...