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

强化模板模块

一、非类型模板参数

模板参数分为 类型模板参数(C++模板的零基础讲解)和非类型模板参数。

看下面的代码

#define N 10 
//T就是类型模板参数
template<class T>
class Array
{
private:T a[N];
};
int main()
{Array<int> a1;Array<double> a2;return 0;
}

上面这个就是类型模板参数,能够创建不同类型的数组。
但是现在有一个要求将a1数组的大小设置为10,a2的大小设置为100.
上面这个操作并不可以完成。

非类型模板参数代码

类型模板参数定义的是类型,而非类型模板参数定义的就是整型常量
注意只能是整型,可以这样认为祖师爷就是为了设置数组的大小所以设置非类型模板参数。
并且不能修改,这个也很容易理解不能改变数组的大小。

//T就是类型模板参数
template<class T,size_t N = 20>
class Array
{
private:T a[N];
};
int main()
{Array<int,10> a1; Array<double,100> a2;return 0;
}

这样我们就可以定义不同大小的数组。

二、模板的特化

我先给你们看一个日期类,然后在进行我们下面的操作

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1): _year(year), _month(month), _day(day){}bool operator<(const Date& d)const{return (_year < d._year) ||(_year == d._year && _month < d._month) ||(_year == d._year && _month == d._month && _day < d._day);}bool operator>(const Date& d)const{return (_year > d._year) ||(_year == d._year && _month > d._month) ||(_year == d._year && _month == d._month && _day > d._day);}friend ostream& operator<<(ostream& _cout, const Date& d){_cout << d._year << "-" << d._month << "-" << d._day;return _cout;}
private:int _year;int _month;int _day;
};

现在的要求是,利用我们的比较类,比较日期的大小。

// 函数模板 -- 参数匹配
template<class T>
bool Less(T left, T right)
{return left < right;
}
int main()
{//比较int类型的数字cout << Less(1, 2) << endl;   // 可以比较,结果正确 //比较两个日期类Date d1(2022, 7, 7);Date d2(2022, 7, 8);cout << Less(d1, d2) << endl;  // 可以比较,结果正确 比较两个日期类的指针Date* p1 = &d1;Date* p2 = &d2;cout << Less(p1, p2) << endl;  // 可以比较,结果错误 return 0;
}

对于比较两个int类型我就不用过多说明。
比较两个日期类,我们在日期类中重载了<,所以可以按照我们想要的要求去比较。
但是对于第三个,我们想要比较指针指向的内容,但是我们比较的时候确实比较的指针,这是不符合我们的要求的。

这时就需要用到模板特化

函数模板特化代码

模板特化就是对某些类型进行特殊化处理

// 函数模板 -- 参数匹配
template<class T>
bool Less(T left, T right)
{return left < right;
}
//模板特化
template<>
bool Less<Date*>(Date* left, Date* right)
{return *left < *right;
}

函数模板特化的步骤

  1. 必须要先有一个基础的函数模板
  2. 关键字template后面接一对空的尖括号<>
  3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型
  4. 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。

类模板特化

类模板的特化分为两种
  1. 全特化
  1. 偏特化

但是都是建立再原模版之上的。
必须有原模板,才能有特化。

全特化

这是针对某个具体的类型进行特化。

template<class T>
struct Less
{bool operator()(const T& left, const T& right){return left < right;}
};
//类模板的特化
template<>
struct Less<Date*>
{bool operator()(const Date* left, const Date* right){return *left < *right;}
};

测试全特化

int main()
{Date d1(2022, 7, 7);Date d2(2022, 7, 8);cout << Less<Date>()(d1, d2) << endl;  Date* p1 = &d1;Date* p2 = &d2;cout << Less<Date*>()(p1, p2) << endl;  return 0;
}

偏特化

下面这个叫做偏特化,就是一种范类进行限制(比如下面的指针)

当这个类有多个模板参数,也可以对部分参数进行偏特化。
可以对任意类型特化,甚至是引用。

template<class T>
struct Less
{bool operator()(const T& left, const T& right){return left < right;}
};
//偏特化
template<class T>
struct Less<T*>
{bool operator()(const T* left, const T* right){return *left < *right;}
};int main()
{Date d1(2022, 7, 7);Date d2(2022, 7, 8);cout << Less<Date>()(d1, d2) << endl;  Date* p1 = &d1;Date* p2 = &d2;cout << Less<Date*>()(p1, p2) << endl;  int* a = new int(1);int* b = new int(2);cout << Less<int*>()(a, b) << endl;return 0;
}

测试偏特化

int main()
{Date d1(2022, 7, 7);Date d2(2022, 7, 8);cout << Less<Date>()(d1, d2) << endl;  Date* p1 = &d1;Date* p2 = &d2;cout << Less<Date*>()(p1, p2) << endl;  return 0;
}

三、模板的分离编译

首先,先记住一点也是最重要的一点,
模板不支持在两个文件的分离编译。

四、模板的优缺点

优点
  1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生
  1. 增强了代码的灵活性
缺陷
  1. 模板会导致代码膨胀问题,也会导致编译时间变长
  1. 出现模板编译错误时,错误信息非常凌乱,不易定位错误

相关文章:

强化模板模块

一、非类型模板参数 模板参数分为 类型模板参数(C模板的零基础讲解)和非类型模板参数。 看下面的代码 #define N 10 //T就是类型模板参数 template<class T> class Array { private:T a[N]; }; int main() {Array<int> a1;Array<double> a2;return 0; }上面…...

Vue.js学习详细课程系列--共32节(6 / 6)

Vue.js学习课程&#xff08;6 / 6&#xff09;29. 组件&#xff1a;参数验证知识点组件的数据综合例30. 组件&#xff1a;事件传递知识点v-on$emit综合例31. 组件&#xff1a;slot插槽知识点slot综合例32. 组件&#xff1a;组合slot知识点slot命名综合例29. 组件&#xff1a;参…...

【TFT屏幕】1.44寸彩屏

文章目录一.硬件层——引脚配置的移植二.应用层——显示函数的移植1. 移植显示一个字符函数2. 移植显示数字函数3.叠加方式选择一.硬件层——引脚配置的移植 宏定义的方式&#xff0c;直接修改引脚&#xff0c;实测可直接更改&#xff0c;非常方便移植 /*******************…...

vue3组合式api

文章目录组合式API介绍什么是组合式 API&#xff1f;为什么要有组合式 API&#xff1f;更好的逻辑复用更灵活的代码组织Option ApiOption Api的缺陷Composition Api更好的类型推导更小的生产包体积与选项式 API 的关系取舍组合式 API 是否覆盖了所有场景&#xff1f;可以同时使…...

Maven高级-私服

Maven高级-私服6&#xff0c;私服6.1 私服简介6.2 私服安装步骤1:下载解压步骤2:启动Nexus步骤3:浏览器访问步骤4:首次登录重置密码6.3 私服仓库分类6.4 本地仓库访问私服配置步骤1:私服上配置仓库步骤2:配置本地Maven对私服的访问权限步骤3:配置私服的访问路径6.5 私服资源上传…...

网络优化小结

网络基础知识 OSI七层网络架构 OSI简称Open System Intercnnect&#xff0c;开放式系统互联&#xff0c;是一个国际互联网标准制定的一个组织 应用层 实际应用场景&#xff0c;比如 浏览器、文件传输、电子邮件、文件服务、虚拟终端等&#xff1b; http、FTP、ssh等 表示层…...

Android 11.0 原生SystemUI下拉通知栏UI背景设置为圆角背景的定制(一)

1.前言 在11.0的系统rom定制化开发中,在原生系统中关于SystemUI下拉状态栏的通知栏的每条通知的背景是白色的四角的背景, 由于在产品设计中,需要把四角背景默认改成白色的圆角背景,所以就需要分析系统原生下拉通知栏的每条通知的默认背景, 这就需要了解11.0的systemui的通…...

个人练习-Leetcode-1942. The Number of the Smallest Unoccupied Chair

题目链接&#xff1a;https://leetcode.cn/problems/the-number-of-the-smallest-unoccupied-chair/ 题目大意&#xff1a;给出一群人到达一个排队的时间和离开派对的时间[arr, lev]。有无数个座位&#xff0c;下标从0开始。当一个人在tm时刻离开时&#xff0c;如果一个人在tm…...

EMC经典问答85问(59-62问)

59、用双向可控硅控制直流电机的调速&#xff0c;但电机会干扰电源影响过零检则&#xff0c;造成不受控或速度妀变。请各位指教&#xff01; 答 1: 出现这中现象的可能性有&#xff1a;1、电机属于非阻性负载&#xff0c;所以电路中产生相位移动&#xff0c;导致控制不准&#…...

Java面向对象 - 封装、继承和多态的综合练习(答案+知识点总结)第1关:封装、继承和多态进阶(一)+ 第2关:封装、继承和多态进阶(二)

目录 第1关&#xff1a;封装、继承和多态进阶&#xff08;一&#xff09; 报错总结 & 注意事项&#xff1a; 第2关&#xff1a;封装、继承和多态进阶&#xff08;二&#xff09; 源码&#xff1a; 报错总结 & 注意事项&#xff1a; 思维导图免费制作网站&#xf…...

小迪安全day20WEB漏洞-文件上传之基础及过滤方式

小迪安全day20WEB漏洞-文件上传之基础及过滤方式 什么是文件上传漏洞 有文件上传就可以测试是否有漏洞&#xff0c;关键看代码是否完备。 服务端代码未对客户端上传的文件进行严格的验证和过滤 漏洞危害 自定义网站后门&#xff0c;获取网站权限&#xff0c;属于高危漏洞。 上…...

LeetCode236.最近的公共祖先

求解最近公共祖先的算法 分为两个步骤&#xff1a; 求出两节点路径取两路径上最后一个相同的节点&#xff08;该节点即为p&#xff0c;q节点的最近公共祖先&#xff09; 节点路径的算法设计与实现 求节点路径即输入二叉树根节点与待求节点返回根节点到该节点路径上的所有节…...

【springcloud 微服务】Spring Cloud Alibaba整合Sentinel详解

目录 一、前言 二、环境准备 2.1 部署sentinel管控台 2.1.1 官网下载sentinel的jar包 2.1.2 启动控制台 2.1.3 访问控制台 2.2 整合springcloud-alibaba 2.2.1 引入相关依赖 2.2.2 修改配置文件 2.2.3 增加一个测试接口 2.2.4 接口测试 三、sentinel 流控规则使用 …...

ASP医院管理系统—病历管理系统的设计与实现

病历管理系统是医院管理系统的重要组成,该系统的开发主要包括后台数据库的建立以及前台应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的数据库,而对于后者则要求具有齐全完善的应用程序功能,友好人性化的操作界面。该系统采用现代的办公自动化…...

【蓝桥杯】动态规划(dp)入门!| 入门动态规划的正确方式! ——学习笔记

目录 最暴力的dfs --> 记忆化搜索 ---> 递推(dp) 记忆化搜索 暴力dfs 记录答案 递推的公式 dfs 向下递归的公式 递推数组的初始值 递归的边界 动态规划(dp)入门 | 这tm才是入门动态规划的正确方式! | dfs记忆化搜索 | 全体起立!!_哔哩哔哩_bilibili 大佬教学视频…...

元宇宙与网络安全

元宇宙是一种虚拟现实空间&#xff0c;用户可以在计算机生成的环境中进行互动。元宇宙的应用范围很广&#xff0c;比如房地产&#xff0c;医疗&#xff0c;教育&#xff0c;军事&#xff0c;游戏等等。它提供了更具沉浸感的体验&#xff0c;更好地现实生活整合&#xff0c;以及…...

Pod控制器之hpa

简述 HPA全称HorizontalPodAutoscaler Pod水平自动扩缩容&#xff0c;Kubernetes控制器HPA是一种用于自动调整Pod数量的控制器。它可以根据资源使用情况自动增加或减少Pod的数量&#xff0c;以确保应用程序的高可用性和性能。HPA可以根据CPU使用率或自定义指标来进行调整&…...

发现一个白嫖GPT4.0的方法!真的是完胜3.5!

大家好&#xff0c;我是五竹。 先说个基本的科普&#xff0c;最近被问的人都嘛了。 1、ChatGPT账号只有两种:普通账号和plus账号。 2、普通账号升级到plus账号&#xff0c;需要绑定国外的支付方式&#xff0c;每个月大概130左右&#xff01;plus账号更稳&#xff01;更快&am…...

数据结构之第四章、ArrayList和顺序表

一、线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。但是…...

webase全家桶搭建教程过程记录+bug解决

前置条件 Ubuntu20 基础环境搭建 检查Java java -version 检查mysql&#xff08;Ubuntu部署MySQL&#xff09; mysql --version 在装MySQL的时候发现了一个问题 就是不管怎么sudo mysql_secure_installation&#xff0c;&#xff0c;第二步设置密码就是不对&#xff0c;解…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...