C++语法(14)---- 模板进阶

news2025/2/27 7:02:58

C++语法(13)---- 模拟实现priority_queue_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/130069707?spm=1001.2014.3001.5501

目录

1.非类型模板参数

2.模板的特化

1.函数模板(仿函数)

2.类模板

1.全特化

2.半特化、偏特化


1.非类型模板参数

1.以前使用的都是类型模板参数,形如 template<class T> 写法的,这种写法适用于泛型编程,我们希望不同的类型都可以通过模板让编译器演化出来

2.面对如静态数组,我们希望构造出的一个数组,c语言静态数组定义大小使用宏定义来解决问题,如下

#define NUM_SIZE 5

namespace MY
{
	template<class T>
	struct arr
	{
	public:
		T _a[NUM_SIZE];
	};
}

int main()
{
	MY::arr<int> arr_int;
	MY::arr<double> arr_double;
	return 0;
}

不过我们如果我们要不同类型的不同数组大小呢?很明显宏定义不是一个很好的解决方法

3.非类型模板参数可以完美解决问题

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

namespace MY
{
	template<class T,size_t N = 100>
	struct arr
	{
	public:
		T _a[N];
	};
}

int main()
{
	MY::arr<int,5> arr_int;
	MY::arr<double,10> arr_double;
	return 0;
}

c++也实现了数组的stl,该实现就是用了非类型模板参数,不过重要的是,array封装中检查了是否访问越界,c++越界读写都检查,c语言读不检查,写随机检查,只查超过范围小的。c++中重写了operator[],里面会判断是否越界。

4.非类型模板参数只适用于常量整型,浮点数不能使用,变量也不可以

2.模板的特化

特化:特殊类型被特殊处理,这种处理就是特化

1.函数模板(仿函数)

未处理的:

假设我们加上了日期类的实现,并且里面有大小比较

template<class T>
bool Less(T left, T right)
{
    return left < right;
}
int main()
{
    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;
}

我们传入的是指针时,会发现日期类的指针是没有办法用现有的仿函数进行比较的,因为其直接比较指针的大小,而不是解引用比较日期

处理的:

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

// 对Less函数模板进行特化
template<>
bool Less<Date*>(Date* left, Date* right)
{
    return *left < *right;
}
int main()
{
    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;
}

特化了less针对Date*的比较,那么当main函数进行到Date*的比较,就使用特化的类进行比较了。

###针对函数模板(仿函数)其实算是重载,使用不加类模板也可以直接写函数

2.类模板

1.全特化

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

//上面的特化
template<>
class Data<double,double>
{
public:
	Data() { cout << "Data<double, double>" << endl; }
private:
	double _d1;
	double _d2;
};

int main()
{
	Data<int,int> D1;
	Data<double,double> D2;

	return 0;
}

2.半特化、偏特化

半特化

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

int main()
{
	Data<int,int> D1;
	Data<double, double> D2;
	Data<int,double> D3;

	return 0;
}

偏特化:参数进行进一步限制

指针和引用

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

int main()
{
	Data<int,int> D1;
	Data<double, double> D2;
	Data<int, double> D3;

	Data<int*, int*> D4;
	Data<int*,double*> D5;

	return 0;
}

 只要是指针都会走这个偏特化

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

INFINONE XC164单片机逆向记录(6)C语言学习

本人所写的博客都为开发之中遇到问题记录的随笔,主要是给自己积累些问题。免日后无印象,如有不当之处敬请指正(欢迎进扣群 24849632 探讨问题); 写在专栏前面https://blog.csdn.net/Junping1982/article/details/129955766 INFINONE XC164单片机逆向记录(1)资料准备

FusionCharts Suite XT v3.20.0 Crack

FusionCharts Suite XT v3.20.0 改进了仪表的径向条形图和调整大小功能。2023 年 4 月 11 日 - 9:37新版本特征 添加了一个新方法“_changeXAxisCoordinates”&#xff0c;它允许用户将 x 轴更改为在图例或数据交互时自动居中对齐。更新了 Angular 集成以支持 Angular 版本 14 …

【无功优化】基于多目标差分进化算法的含DG配电网无功优化模型【IEEE33节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

SAM - 分割一切图像【AI大模型】

如果你认为 AI 领域已经通过 ChatGPT、GPT4 和 Stable Diffusion 快速发展&#xff0c;那么请系好安全带&#xff0c;为 AI 的下一个突破性创新做好准备。 推荐&#xff1a;用 NSDT场景设计器 快速搭建3D场景。 Meta 的 FAIR 实验室刚刚发布了 Segment Anything Model (SAM)&am…

电脑软件:推荐一款Windows剪贴板增强软件——ClipX

目录 ClipX能做什么&#xff1f; 软件优点 软件不足之处 今天要介绍的剪切板神器——ClipX&#xff0c;拥有它可以作为弥补Windows 自带的剪贴板的短板的增强型工具软件。 ClipX能做什么&#xff1f; 1. 扩充剪贴板数量&#xff0c;数量可以自己设置 ClipX支持4到1024个剪…

Flutter(三)--可滚动布局

之前介绍了布局和容器&#xff0c;它们都用于摆放一个或多个子组件&#xff0c;而实际应用中&#xff0c;受限于手机、Pad、电脑的屏幕大小&#xff0c;一个布局不可能摆放无限个组件&#xff0c;我们往往采取滚动的方式&#xff0c;来使得一部分组件展示在屏幕上&#xff0c;一…

L2-041 插松枝PTA

人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上&#xff0c;做成大大小小的松枝。他们的工作流程&#xff08;并不&#xff09;是这样的&#xff1a; 每人手边有一只小盒子&#xff0c;初始状态为空。每人面前有用不完的松枝干和一个推送器&#xff0c;每次推送一…

piwigo安装及初步使用

一 摘要 本文主要介绍piwigo 安装及初步使用&#xff0c;nginx \php\mysql 等使用 docker 安装 二 环境信息 2.1 操作系统 CentOS Linux release 7.9.2009 (Core)2.2 piwigo piwigo-13.6.0.zip三 安装 3.1安装资源下载 piwigo 请到官网下载https://piwigo.org 安装步骤也…

【STL九】关联容器——map容器、multimap容器

【STL九】关联容器——map容器、multimap容器一、map简介二、头文件三、模板类四、map的内部结构五、成员函数1、迭代器2、元素访问3、容量4、修改操作~~5、操作~~5、查找6、查看操作六、demo1、查找find2、查找lower_bound、upper_bound3、insert、emplace() 和 emplace_hint(…

超详细!Apache+Tomcat+mod_jk搭建负载均衡集群

目录 0.流程图&#xff1a; 1.集群环境&#xff1a; 2.Apache服务器安装httpd&#xff1a; 3.tomcat1服务器和tomcat2服务器安装jdk和Tomcat 4.tomcat1服务器和tomcat2服务器创建页面&#xff1a; 5.Apache服务器的mod_jk模块的安装&#xff1a; 6.查看是否mod_jk.so模块…

DMDSC问题测试

问题一&#xff1a;手动停止两节点&#xff0c;单独启动节点二测试 集群停库前状态&#xff0c;登录监视器查看 dmcssm INI_PATHdmcssm.ini show 节点一&#xff1a; [dmdbalocalhost ~]$ DmServiceDMSERVER stop Stopping DmServiceDMSERVER: …

Go语言开发小技巧易错点100例(六)

往期回顾&#xff1a; Go语言开发小技巧&易错点100例&#xff08;一&#xff09;Go语言开发小技巧&易错点100例&#xff08;二&#xff09;Go语言开发小技巧&易错点100例&#xff08;三&#xff09;Go语言开发小技巧&易错点100例&#xff08;四&#xff09;Go…

微信小程序开发-云开发降低资源调用次数

问题 微信小程序云开发是很方便&#xff0c;减少了后端的大量工作&#xff0c;但是&#xff01; 流量主的一点广告费&#xff0c;一不小心就全被腾讯薅走了&#xff01;当然一种办法就是使用云服务器自建后端&#xff0c;也要付费&#xff0c;没有对比过&#xff0c;不知道各…

如何在移动应用中集成美颜SDK实现人脸识别和美化功能?

随着移动应用的普及和人们对美的追求&#xff0c;美颜功能已成为很多应用的必备功能。而为了实现这样的功能&#xff0c;开发者需要使用美颜SDK。本文将从以下几个方面介绍如何在移动应用中集成美颜SDK实现人脸识别和美化功能。 一、美颜SDK的介绍 美颜SDK是一种用于美化人脸的…

应用程序接口(API)安全的入门指南

本文简单回顾了 API 的发展历史&#xff0c;其基本概念、功能、相关协议、以及使用场景&#xff0c;重点讨论了与之相关的不同安全要素、威胁、认证方法、以及十二项优秀实践。 根据有记录的历史&#xff0c;随着 Salesforce 的销售自动化解决方案的推出&#xff0c;首个 We…

缩短客户响应时间的 5 种方法

在当今竞争激烈的世界中&#xff0c;客户服务就是确保卓越的客户体验。这意味着顶级品牌必须竞争为客户提供最好的客户服务&#xff0c;而且提供最快的响应时间。 改善客户服务响应时间的 5种方法 1.使用正确的客户服务软件 客户服务软件是您可以为提高客户服务而进行的最佳投资…

手写Spring框架-前奏-注解与自定义注解

目录 注解 介绍 功能 分类 注解处理器类库 自定义注解 常用元注解 自定义 注解 介绍 提供一种为程序元素设置元数据的方法用来将任何的信息或元数据&#xff08;metadata&#xff09;与程序元素&#xff08;类、方法、成员变量等&#xff09;进行关联元数据是指数据的…

游戏工厂:AICG/ChatGPT与流程式游戏开发(码客 卢益贵)

关键词&#xff1a;AI&#xff08;AICG、ChatGPT、文心一言&#xff09;、流程式管理、好莱坞电影流程、电影工厂、游戏工厂、游戏开发流程、游戏架构、模块化开发 一、前言 开发周期长、人工成本高、成功率低等是游戏公司融资困难的罪因。所以有的公司凭一个爆款游戏一骑绝尘…

【MySQL】MySQL索引优化——从原理分析到实践对比

目录 使用TRACE分析MySQL优化 开启TRACE TRACE 结果集 ORDER BY & GROUP BY 优化 优化方式 分页优化 不同场景的优化方式 JOIN关联优化 算法介绍 优化方式 COUNT优化 优化方式 使用TRACE分析MySQL优化 某些情况下&#xff0c;MySQL是否走索引是不确定的[,,_,,…

给word文档中的公式标号

给word文档中的公式标号 首先编写一个公式 cosθa2b2−c22abcos\theta\frac{a^2b^2-c^2}{2ab} cosθ2aba2b2−c2​ 在公式的最后&#xff08;不要超出公式块&#xff09;输入#()并按回车&#xff1a; 即可在生成的框中输入公式序号&#xff1a;