模板(Template)

模板的参数

类型形参(Type Parameters)非类型形参(Non-type Parameters)

类型形参(Type Parameters):使用关键字 classtypename 来声明一个代表类型的参数

非类型形参(Non-type Parameters):除了类型之外,还可以指定其他类型的参数,比如整数、指针或引用等。这些参数用于模板实例化时传递具体的值。

template<class T, size_t N =10>
class array
{

 T _arra[N]; // 使用非类型参数 N 来指定数组大小
public:
	T& operator[](size_t index)
	{
		return _arra[index];
	}
};

在这里面,T就是类型形参,N 就是非类型形参,定义了一个可以容纳 N 个元素的数组 _arra,其中 N 可以在实例化模板类时指定,如果不指定则默认为 10。这样,您就可以根据需要创建不同大小的数组对象了。

注意:

1.浮点数和类对象不允许作为非类型的模板参数。

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

3.整形家族都可以作为非类型模板参数,

  1. 整型和枚举类型

    • 包括 intlongshortcharbool 等内置整型。
    • 枚举类型也可以作为非类型模板参数。
  2. 指针类型

    • 可以是指向对象或函数的指针(包括静态成员函数)。
    • 指针必须指向具有外部链接的对象或函数(即全局作用域中的对象或函数)。
  3. 左值引用类型

    • 可以是左值引用(T&),但通常用于指向常量的引用。
  4. std::nullptr_t

    • 可以使用 nullptr 作为非类型模板参数。
  5. 浮点数(C++20起支持)

    • C++20 标准开始支持浮点数作为非类型模板参数。
  6. 类类型(C++20起支持)

    • C++20 引入了对某些类类型的非类型模板参数的支持,这些类必须满足特定的要求(如字面量类型)。

模板的特化

函数模板的特化类模板的特化

在原模板的基础上,对特殊类型进行特殊化的实现方法

函数模板特化(显示专用化)

要注意两个<>,一个是在template后面,一个是函数的名字后面

如果在在传的参数的是一个指针的话,就会比较指针的地址,而指针又是会不断的变化的。

template<>
bool Less<int*>(int* left, int* right)
{
	return *left < *right;
}
不过我们所推荐的写法还是用函数的方式,在有现成的函数和模板情况下,编译器会直接用函数
bool LessFunc(const Date* left, const Date* right)

{

return *left < *right;

}

类模板的特化

全特化偏特化

全特化

将模板中的参数都确定化

template<>
class Data<int, char>
{
public:
	Data()
	{
		std::cout << "Data< T1 , T2>" << std::endl;
	}
private:
	int _d1;
	char _d2;
 };

和函数模板特化差不多,就是加两个<>,然后就是将里面的参数给换成确定的类型

偏特化

任何对模板参数进行条件限制的特化版本

特点:

如果有全特化与偏特化的时候就会选择全特化

template<class T1, class T2>
class Date {
public:
	Date() {
		std::cout << "Date<T1, T2>" << std::endl;
	}
private:
	T1 _d1;
	T2 _d2;
};

template<class T1>
class Date<T1, int> { // 注意这里的语法,正确地指定了部分特化的参数列表
public:
	Date() { // 修正构造函数名称
		std::cout << "Date<T1, int>" << std::endl;
	}
private:
	T1 _d1;
	int _d2;
};

在我们写的时候发现了一些问题

主模板缺失:在C++中,为了进行部分特化,必须首先有一个通用(主)模板定义。部分特化是基于这个通用模板的。

template<typename T1,typename T2>
class Data<T1*, T2*>
{
public:
	Data()
	{
		cout << "Data<T1*, T2*>" << endl;
	}
private:
	T1* _d1;
	T2* _d2;
};

 模板分离编译

主要是讲一下程序的编译的过程

预处理

1.头文件展开  2.宏替换   3 .去掉注释  

编译

检查语法错误,生成汇编语言,进行直接实例化

汇编

汇编代码准话为2进制的机器吗

链接

将目标梦见整合在一起,生成克执行的程序

仿函数

 是一种特殊的类或结构体对象,它重载了 operator(),使其可以像普通函数一样被调用

优点:

效率:仿函数通常比使用函数指针更高效,因为它们可以通过内联调用优化性能。

自己写仿函数情况:

1.类类型不支持比较大小

2.支持比较大小,但是逻辑比较大小不是你想要的

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

StarRocks BE源码编译、CLion高亮跳转方法

阅读SR BE源码时&#xff0c;很多类的引用位置爆红找不到&#xff0c;或无法跳转过去&#xff0c;而自己的Linux机器往往缺乏各种C依赖库&#xff0c;配置安装比较麻烦&#xff0c;因此总体的思路是通过CLion远程连接SR社区已经安装完各种依赖库的Docker容器&#xff0c;进行编…

Axure PR 9 旋转效果 设计交互

大家好&#xff0c;我是大明同学。 这期内容&#xff0c;我们将学习Axure中的旋转效果设计与交互技巧。 旋转 创建旋转效果所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.在元件库中拖出一个按钮元件。 创建交互 创建按钮交互状态 1.选中按钮元件&#xf…

Java - 引用类型:强引用、软引用、弱引用和虚引用详解

文章目录 概述1. 强引用&#xff08;Strong Reference&#xff09;1.1 什么是强引用&#xff1f;1.2 强引用的特点1.3 强引用的使用场景1.4 强引用的注意事项 2. 软引用&#xff08;Soft Reference&#xff09;2.1 什么是软引用&#xff1f;2.2 软引用的特点2.3 软引用的使用场…

S4 HANA给科目分配允许记账的税码

本文主要介绍在S4 HANA OP中给科目分配允许记账的税码相关设置。具体请参照如下内容&#xff1a; 1. 给科目分配允许记账的税码 以上配置定义了总账科目可以使用什么税码进行记账。通常在科目主数据中会明确总账科目的“Tax Category”来请明确总账科目可以使用什么类型的税码…

xss-labs靶场

xss-labs靶场 xss攻击类型 反射型xss 即攻击者将恶意脚本嵌入到url或者表单中&#xff0c;当用户访问特定的url或者提交表单时&#xff08;用户端请求时)&#xff0c;恶意脚本会执行 攻击需要用户点击恶意链接或访问包含恶意参数的url触发 存储型xss 即攻击者将恶意脚本提交…

CVE-2024-23897-Jenkins任意文件读取漏洞复现

content Jenkins是什么CVE-2024-23897总结修复建议 Jenkins是什么 Jenkins是一人基于Java开发的、可扩展的持续集成引擎&#xff0c;用于持续、自动地构建/测试软件项目&#xff0c;可以监控一些定时执行的任务。 官网文档&#xff1a; Jenkins是一款开源 CI&CD 软件&…

解析 Oracle 中的 ALL_SYNONYMS 和 ALL_VIEWS 视图:查找同义词与视图的基础操作

目录 前言1. ALL_SYNONYMS 视图2. ALL_VIEWS 视图3. 扩展 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 1. ALL_SYNONYMS 视图 在 Oracle 数据库中&#xff0c;同义词&#xff08;Synonym&#xff09;是对数…

30.Word:设计并制作新年贺卡以及标签【30】

目录 NO1.2 NO3邮件合并-信函 NO4邮件合并-标签​ NO1.2 另存为/F12&#xff1a;考生文件夹&#xff1a;Word.docx布局→页面设置对话框→页边距&#xff1a;上下左右→纸张&#xff1a;宽度/高度&#xff08;先调页边距&#x1f197;&#xff09;设计→页面颜色→填充效果→…

Unity实现按键设置功能代码

一、前言 最近在学习unity2D&#xff0c;想做一个横版过关游戏&#xff0c;需要按键设置功能&#xff0c;让用户可以自定义方向键与攻击键等。 自己写了一个&#xff0c;总结如下。 二、界面效果图 这个是一个csv文件&#xff0c;准备第一列是中文按键说明&#xff0c;第二列…

一个简单的自适应html5导航模板

一个简单的 HTML 导航模板示例&#xff0c;它包含基本的导航栏结构&#xff0c;同时使用了 CSS 进行样式美化&#xff0c;让导航栏看起来更美观。另外&#xff0c;还添加了一些 JavaScript 代码&#xff0c;用于在移动端实现导航菜单的展开和收起功能。 PHP <!DOCTYPE htm…

TensorFlow 示例摄氏度到华氏度的转换(一)

TensorFlow 实现神经网络模型来进行摄氏度到华氏度的转换&#xff0c;可以将其作为一个回归问题来处理。我们可以通过神经网络来拟合这个简单的转换公式。 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与预测 7. 保存与加载模型 …

2.1.3 相机图像信号处理的基本流程

文章目录 ISP基本流程ISP各基本流程职责 ISP基本流程 图像信号处理将传感器采集到的Bayer阵列数据转换成符合人眼观感的图像数据。ISP(Image Signal Processing)图像信号处理基本流程包括坏点校正&#xff08;DPC, Defect Pixel Correction&#xff09;&#xff0c;黑电平校正&…

51单片机CLD1602显示万年历+闹钟+农历+整点报时

1. 硬件设计 硬件是我自己设计的一个通用的51单片机开发平台&#xff0c;可以根据需要自行焊接模块&#xff0c;这是用立创EDA画的一个双层PCB板&#xff0c;所以模块都是插针式&#xff0c;不是表贴的。电路原理图在文末的链接里&#xff0c;PCB图暂时不选择开源。 B站上传的…

颠覆AI界限!o3-mini与DeepSeek V3的巅峰对决

性能之战&#xff1a;谁才是AI推理的王者&#xff1f; 在AI技术飞速发展的今天&#xff0c;OpenAI最新发布的o3-mini模型如同一颗新星&#xff0c;闪耀在AIGC的天空中。它不仅带来了惊人的性能提升&#xff0c;还具备了多项用户友好的功能。与此同时&#xff0c;DeepSeek V3也…

Spring Boot项目如何使用MyBatis实现分页查询

写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油&#xff0c;冲鸭&#x…

PDCA 循环法

目录 循环周而复始大环套小环阶梯式上升 如何从 0 开始搭建 PDCA应用场景示例一、健身 APP 拉新活动策划第一阶段&#xff1a;制定详细的活动计划与方案第二阶段&#xff1a;活动执行阶段第三阶段&#xff1a;活动效果监控阶段第四阶段&#xff1a;活动复盘阶段 二、员工培训三…

深入理解Spring事务管理

一、事务基础概念 1.1 什么是事务&#xff1f; 事务&#xff08;Transaction&#xff09;是数据库操作的最小工作单元&#xff0c;具有ACID四大特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务中的操作要么全部成功&#xff0c;要么全部失败 一致…

【Linux-网络】初识计算机网络 Socket套接字 TCP/UDP协议(包含Socket编程实战)

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长&#xff0c;行则将至 目录 &#x1f4da;一、初识计算机网络 &#x1f4d6; 背景 &#x1f4d6; 网络协议 &#x1f516;OSI七层…

2 MapReduce

2 MapReduce 1. MapReduce 介绍1.1 MapReduce 设计构思 2. MapReduce 编程规范3. Mapper以及Reducer抽象类介绍1.Mapper抽象类的基本介绍2.Reducer抽象类基本介绍 4. WordCount示例编写5. MapReduce程序运行模式6. MapReduce的运行机制详解6.1 MapTask 工作机制6.2 ReduceTask …

【Rust自学】15.5. Rc<T>:引用计数智能指针与共享所有权

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 15.5.1. 什么是Rc<T> 所有权在大部分情况下都是清晰的。对于一个给定的值&#xff0c;程序员可以准确地推断出哪个变量拥有它。 …