面向对象程序设计之模板进阶(C++)

在之前我出过一篇博客介绍了模版的初阶:面向对象程序设计(C++)模版初阶,接下来我们将进行模版的进阶学习,介绍关于更多模版的知识

1.非类型模版参数 

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

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

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

 非类型模版参数相较于宏更加灵活,array中就使用到了非类型模版参数,相当于静态数组,可以根据需要开辟指定大小的数组,array的好处就是可以对于越界检查很有效,并且在栈上开空间,比在堆上更加高效,栈上开空间是向下生长,从高地址到低地址

一般来说普通数组会在数组末尾设置标志位,如果标志位被改变就越界报错,所以一般对于读则不会越界警告,而写入数据会报错

注意:

1. 浮点数、类对象以及字符串是不允许作为非类型模板参数的

2. 非类型的模板参数必须在编译期就能确认结果

非类型模版
相比与宏更加灵活
只能用于整型,其他类型不可以,char/int/short/bool等整型
C++20支持double类型
template<size_t N>
class Stack
{
private:int _a[N];int _top;
};int main()
{Stack<5> a1;Stack<10> a2;return 0;
}------------------------------------------------------------------------------------------
使用了非类型模版的结构
array:静态数组
对于越界检查很有效
在栈上开空间,比在堆上更加高效
栈上开空间是向下生长,从高地址到低地址int main()
{//一般来说普通数组会在数组末尾设置标志位,如果标志位被改变就越界报错//所以一般对于读则不会越界警告,而写会int a[10] = { 0 };cout << a[11] << endl;a[11] = 1;//静态数组对于越界访问的读与写都会报错array<int, 10> b;cout << b[11] << endl;b[11] = 1;return 0;
}

 2.模版的特化

通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些 错误的结果,需要特殊处理,比如:实现了一个专门用来进行小于比较的函数模板

注意:一般情况下如果函数模板遇到不能处理或者处理有误的类型,为了实现简单通常都是将该 函数直接给出

函数模板的特化步骤:

1. 必须要先有一个基础的函数模板

2. 关键字template后面接一对空的尖括号<>

3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型

4. 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误

特化
template<class T>
bool LessFun(const T& left, const T& right)
{return left < right;
}特化
这里注意上面的const修饰的是left本身,所以下面特化的const需要在*右边
template<>
bool LessFun<Date*>(Date* const& left, Date* const& right)
{return *left < *right;
}//推荐
bool LessFun(Date* const& left, Date* const& right)
{return *left < *right;
}

 2.1全特化

全特化即是将模板参数列表中所有的参数都确定化

类模版特化
1.全特化
template<class T1, class T2>
class Data
{
public:Data() { cout << "Data<T1,T2>" << endl; }
private:T1 _d1;T2 _d2;
};template<>
class Data<int,char>
{
public:Data() { cout << "Data<int,char>" << endl };
}

2.2偏特化

偏特化:任何针对模版参数进一步进行条件限制设计的特化版本

//2.半特化、偏特化
template<class T1>
class Data<T1, double>
{
public:Data() { cout << "Data<T1,double>" << endl };
};//偏特化特殊类型
//传的类型是指针
template<class T1,class T2>
class Data<T1*, T2*>
{
public:Data() { cout << "Data<T1*,T2*>" << endl };
};//传的是引用
template<class T1,class T2>
class Data<T1&, T2&>
{
public:Data() { cout << "Data<T1*,T2*>" << endl };
};

2.2.1部分特化

将模板参数类表中的一部分参数特化

// 将第二个参数特化为inttemplate <class T1> class Data<T1, int>{public:Data() {cout<<"Data<T1, int>" <<endl;}private:T1 _d1;int _d2;
}; 

2.2.2参数更进一步限制 

偏特化并不仅仅是指特化部分参数,而是针对模板参数更进一步的条件限制所设计出来的一 个特化版本

//两个参数偏特化为指针类型 template <typename T1, typename T2> class Data <T1*, T2*> 
{ public:Data() {cout<<"Data<T1*, T2*>" <<endl;}private:T1 _d1;T2 _d2;
};//两个参数偏特化为引用类型template <typename T1, typename T2>class Data <T1&, T2&>{public:Data(const T1& d1, const T2& d2): _d1(d1), _d2(d2){cout<<"Data<T1&, T2&>" <<endl;}private:const T1 & _d1;const T2 & _d2;    };void test2 () 
{Data<double , int> d1;      // 调用特化的int版本Data<int , double> d2;      // 调用基础的模板    Data<int *, int*> d3;       // 调用特化的指针版本Data<int&, int&> d4(1, 2);  // 调用特化的指针版本}

3.模版的分离编译

一般地,模版不建议声明与定义分离,如果使用的话有如下解决方法:

1. 将声明和定义放到一个文件 "xxx.hpp" 里面或者xxx.h其实也是可以的。推荐使用这种

2. 模板定义的位置显式实例化。这种方法不实用,不推荐使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/423481.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电力系统调度控制台的功能有哪些

在复杂多变的现代电力系统中&#xff0c;调度控制台作为其核心管理与控制的中枢&#xff0c;扮演着不可或缺的角色。它不仅是确保电网安全稳定运行的关键&#xff0c;也是实现电力资源高效配置的重要工具。那么&#xff0c;电力系统调度控制台究竟具备哪些关键功能呢? 首先&am…

Easyexcel导入数据,没有指定文件路径临时文件在什么位置?

1、SpringBoot接口导入Excel&#xff0c;MultipartFile转File public static File convertToFile(MultipartFile multipartFile) throws IOException {// 将 MultipartFile 转换为 byte[]byte[] bytes multipartFile.getBytes();// 创建一个临时文件File tempFile File.creat…

大模型时代的企业转型:RAG技术的进化与挑战

从2023年起开始火爆的大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;&#xff0c;如GPT/Gemini/通义千问/GLM/文心一言/豆包等&#xff0c;经过了一年多的比拼和进化&#xff0c;已经几乎涵盖了所有通用性、常识性的知识和理解力&#xff1b; 与之同…

基于Java+Mysql实现(web)大型企业管理系统

技术报告 第一章 系统概述 包括用户管理、权限管理、软件项目管理、软件模块管理、测试用例管理、测试任务分配、bug管理等功能。实现公司不同部门间团队协作&#xff0c;管理人员也能够更加有效的把控系统开发的进度。 本实验综合应用JavaWeb编程中的Servlet&#xff0c;JS…

iPhone 16分辨率,屏幕尺寸,PPI 详细数据对比 iPhone 16 Plus、iPhone 16 Pro、iPhone 16 Pro Max

史上最全iPhone 机型分辨率&#xff0c;屏幕尺寸&#xff0c;PPI详细数据&#xff01;已更新到iPhone 16系列&#xff01; 点击放大查看高清图 &#xff01;

电商api接口:让数据成为生产力的第一利器

随着电子商务的蓬勃发展&#xff0c;数据已成为推动业务增长和优化用户体验的关键因素。为了满足商家和开发者对多元化电商服务的需求&#xff0c;聚合电商 API 接口平台应运而生。这类平台通过整合多个电商平台的 API 接口&#xff0c;为商家和开发者提供一站式的数据服务&…

Apisix离线安装

上传离线包 #ll apisix-3.2.2-0.el7.x86_64.rpm apisix-base-1.21.4.1.8-0.el7.x86_64.rpm apisix-dashboard-3.0.1-0.el7.x86_64.rpm cyrus-sasl-2.1.26-24.el7_9.x86_64.rpm cyrus-sasl-devel-2.1.26-24.el7_9.x86_64.rpm cyrus-sasl-gssapi-2.1.26-24.el7_9.x86_64.rpm cyr…

HTB-Unified(log4j2漏洞、MongoDb替换管理员密码)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解Unified靶机 渗透过程 信息搜集 服务器开放了SSH服务&#xff0c;HTTP服务 访问网站 验证log4j2漏洞 8443端口&#xff1a;UniFi 网络 &#xff0c;访问查询 是否有Nday漏洞利用 可以观察到UniFi的版…

【网络安全的神秘世界】渗透测试基础

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 渗透测试基础 基于功能去进行漏洞挖掘 1、编辑器漏洞 1.1 编辑器漏洞介绍 一般企业搭建网站可能采用了通用模板&#xff…

【计算机网络】电路交换、电报交换、分组交换

【计算机网络】电路交换、电报交换、分组交换 目录 【计算机网络】电路交换、电报交换、分组交换1. 电路交换2. 电报交换3. 分组交换4. 基于分组交换~“虚电路交换”技术 1. 电路交换 电路交换&#xff08;Circuit Switching&#xff09;:通过物理线路的连接&#xff0c;动态地…

linux_L2_linux删除文件

linux 删除文件 在Linux下删除文件有多种实现方法&#xff0c;以下是其中几种常见的方法&#xff1a; 方法一&#xff1a;使用rm命令删除单个文件 rm 文件路径例如&#xff0c;删除当前目录下的文件file.txt&#xff1a; rm file.txtQuestion :当你在Linux系统中使用rm命令删…

Git学习尚硅谷(005 idea集成git)

尚硅谷Git入门到精通全套教程&#xff08;涵盖GitHub\Gitee码云\GitLab&#xff09; 总时长 4:52:00 共45P 此文章包含第27p-第p32的内容 文章目录 忽略特定文件在家目录里创建这个文件在.gitconfig文件里配置这个文件 配置IDEA定位到git程序进行添加文件初始化本地库添加单个…

Mini-Omni 语言模型在流式传输中边思考边听说应用

引入简介 Mini-Omni 是一个开源的多模态大语言模型,能够在思考的同时进行听觉和语言交流。它具有实时端到端语音输入和流媒体音频输出的对话能力。 语言模型的最新进展取得了显著突破。GPT-4o 作为一个新的里程碑,实现了与人类的实时对话,展示了接近人类的自然流畅度。为了…

下一代 AI 教育:知识图谱RAG + 多智能体,听老师的话没前途,让老师听你的才是正道

下一代 AI 教育&#xff1a;知识图谱RAG 多智能体&#xff0c;听老师的话没前途&#xff0c;让老师听你的才是正道 下一代 AI 教育&#xff1a;基于最本质的用脑方式学习 理解 记忆&#xff1f;学习的 3 个层次文科&#xff1a;关联理解 关联分析 关联记忆秒背古诗古文商业…

前端用html写excel文件直接打开

源码 <html xmlns:o"urn:schemas-microsoft-com:office:office" xmlns:x"urn:schemas-microsoft-com:office:excel" xmlns"http://www.w3.org/TR/REC-html40"> <head><meta charset"UTF-8"><!--[if gte mso 9]&…

打架监测识别摄像机

打架监测识别摄像机 是一种用于监控和识别打架行为的智能监控设备。这种摄像机利用先进的人工智能和计算机视觉技术&#xff0c;能够准确识别出监控画面中发生的打架事件&#xff0c;从而及时采取必要的应对措施。 打架监测识别摄像机的工作原理是通过对监控画面的实时分析和识…

YOLOv8 人体姿态估计动作识别关键点检测(代码+教程)

YOLOv8 人体姿态判断 项目介绍 YOLOv8 人体姿态判断 是一个基于最新YOLOv8模型的深度学习项目&#xff0c;旨在识别和分析人体姿态。该项目利用先进的计算机视觉技术和深度学习框架&#xff0c;通过摄像头捕捉实时图像或处理存储图像&#xff0c;识别人体的关键点&#xff0c…

大语言模型如何助力药物开发? 哈佛George Church Lab最新综述

大语言模型因其展现出类人般的推理、工具使用和问题解决能力而备受瞩目&#xff0c;此外&#xff0c;它在化学、生物学等专业领域也展现出深厚的理解能力&#xff0c;进一步提升了其应用价值。本文阐述大语言模型可以在理解疾病机制、药物发现和临床试验三个药物发现的基本阶段…

【西电电装实习】5. 无人机模块及作用、上位机的操作

文章目录 前言一、硬件结构电源、电源电压测试电路晶振外围陀螺仪信号放大电路及天线空心杯&#xff08;电极&#xff09;驱动电路 软件设置整机装配PID 参数设置公式 参考文献 前言 西电电装实习&#xff0c;无人机原理图、上位机的调节方法 一、硬件结构 电源、电源电压测…

UEFI学习笔记(二):edk2构建编译流程

UEFI入门&#xff08;二&#xff09;&#xff1a;edk2项目编译流程 一、Build流程框架Build的三个阶段&#xff1a;1、Autogen2、Make3、ImageGen 二、编译构建步骤&#xff1a;1. 安装依赖工具2. 初始化构建环境3. 配置工具链和目标4. 定义平台配置5. 构建并编译 三、uefi-too…