模板进阶(仿函数,特化等介绍)

news2024/11/15 11:21:14

非类型模板参数

模板参数有类型形参和非类型形参;

类型形参:使用typename或者class修饰的参数类型名称

非类型形参:一个普通常量作为模板参数形参,不能为浮点数,字符类型以及类对象;

#include<iostream>
using namespace std;

template<class T, size_t N = 64>
class test {

private:
	T data = 10;
public:
	void print()
	{
		cout << data << endl << N << endl;
	}

};


int main()
{

	test<int> a;
	a.print();
	return 0;
}

上面的代码中,T就是典型的类型形参,N为非类型形参,这个N我们在类函数成员中可以直接使用

模板的特化

我们都知道,使用模板能够很方便的做出能够适应各种场景的函数,比如比较大小,加减法等函数:


template<class T>
bool Less(T a, T b)
{
	return a <  b;
}

int main()
{
	cout << Less(1, 2) << endl;

	Date a(2022, 7, 8);
	Date b(2022, 7, 7);
	cout << Less(a, b)<< endl;



	return 0;
}

 

 

比如这样,就能够比较 int,double 之类的类型,但是有时候我们的类型可能无法满足我们的需求

 比如:

 我们需要比较的是Date类中的日期大小,但是我们传 Date* 类型进行比较时;

却发现比较的结果实际上是按照地址的大小来进行比较的。

对于这种情况,就需要我们的函数模板的特化出场了;

函数模板特化的步骤

1.有一个基础的函数模板

2.有一个template关键字,后面跟着一个空的<>

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

4.函数形参表必须和模板函数的基础参数类型完全相同,否则会报错

比如上面的 Less 模板函数如何特化?

template<class T>
bool Less(T a, T b)
{
	return a <  b;
}

template<>
bool Less<Date*>(Date* a, Date* b)
{
	return *a < *b;
}

 我们对比基础函数模板,我们发现,特化的函数模板不仅template后面跟着空的 <> ,而且函数名后还有一个 <> ,并且里面有特化的类型,且形参名都是相同的

这样我们就能够顺利比较 Date* 类型的参数了;

 

即然有函数的模板特化,那么就有类的模板特化

类的模板特化和函数的模板特化的规则类似。

类的模板特化

类的模板特化分为两种——全特化和偏特化;

我们先了解简单的全特化

全特化

template<class T1,class T2>
class Test {
public:
	Test()
	{
		cout << "Test(T1,T2)" << endl;
	}

private:
	T1 a;
	T2 b;
};

template<>
class Test<char, char> {
public:
	Test()
	{
		cout << "Test(char,char)" << endl;
	}
};

int main()
{
	Test<int, int> t1;
	Test<char, char> t2;

	return 0;
}

全特化和函数特化一样,需要有基础的类模板,并且还得有其他一些条件才能实现特化;

若是创建的类对象和特化的类型一致,就会使用特化的类

偏特化

所谓偏特化就是指这个类并非全都是指定一个类型,而是有特化有没特化的。

template<class T1>
class Test<T1, int> {
public:
	Test()
	{
		cout << "Test(T1,int)" << endl;
	}
};

 就比如这个,我们指定特化第二个参数是 int 类型的,因此若是后面使用 int 类型当做第二个模板参数,就会使用这个类型;

int main()
{
	Test<int, int> t1;
	Test<char, char> t2;
	Test<char, int> t3;
	return 0;
}

 

而偏特化里面还有一个更特殊的——针对模板参数进一步条件限制设计出来的特化版本

这个和普通的偏特化不同,它的规则不同,我们先来看看实例;

template<class T1,class T2>
class Test<T1&, T2&> {
public:
	Test()
	{
		cout << "Test(T1&,T2&)" << endl;
	}
};

我们发现,它的template后不是跟着空 <>,其内部有正常的模板参数;

但是类名后面跟着不同指定特化的类型。

这就是进一步限制条件的特化版本

模板特化应用示例

比如我们使用一个仿函数用来比较函数时,我们有时单纯靠模板无法满足需求,就需要特化版本来满足需求;

template<class T>
class Less {
	bool operator()(const T&x,const T& y)const 
	{
		return x < y;
	}

比如这个,我们比较普通的类型无所谓,但是若是比较的是 Date* 的类型时,就会比较地址大小导致出错,因此需要特化。

template<>
class Less<Date*>
{
	bool operator()(const Date* x, const Date* y)
	{
		return *x < *y;
	}
};

模板分离编译

当我们写模板类的时候需要注意一个点——模板类不能分离编译。

什么是分离编译?就是指模板函数或者模板类的函数声明和定义分别在不同的文件

而模板函数和模板类的声明和定义在不同位置会导致出错。

这是因为编译器对于每个源文件都是独立编译的,若是分离编译则会导致源文件之间没有交互,导致对应的模板没有实例化,从而出错。

具体解决办法就是将声明定义放在一起,从而避免出错。

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

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

相关文章

虹科新品| HK-TrueNAS企业存储

一、HK-TrueNAS概述HK-TrueNAS 是一种统一存储阵列&#xff0c;提供混合和全闪存配置&#xff0c;以前所未有的价格提供全面的功能集和高达 10.5PB 的容量。TrueNAS 全闪存存储阵列为以闪存为中心的数据中心提供了理想的统一数据存储。每个混合和全闪存 TrueNAS 系统都使用 Tru…

VSCode 开发配置,一文搞定(持续更新中...)

一、快速生成页面骨架 文件 > 首选项 > 配置用户代码片段 选择需要的代码片段或者创建一个新的&#xff0c;这里以 vue.json 举例&#xff1a; 下面为我配置的代码片段&#xff0c;仅供参考&#xff1a; {"Print to console": {"prefix": "…

Mac系统配置java、Android_sdk、gradle、maven、ndk、flutter、tomcat环境变量

搞了三天&#xff0c;终于搞定MAC系统下的各种环境变量了…… 旧版本10.13.6或者更老的MAC系统&#xff0c;只用在.bash_profile文件编辑就行了&#xff1b;新版本10.14.2、10.15.7或者更高的&#xff0c;还要去.zshrc文件加一句source ~/.bash_profile&#xff0c;才能使所有…

java明文数据加密、脱敏方法总结

前言 在一些安全性要求比较高的项目里&#xff0c;避免不了要对敏感信息进行加解密&#xff0c;比如配置文件中的敏感信息。 第一种方法&#xff08;自定义加解密&#xff09; 加解密工具类&#xff1a; public class SecurityTools {public static final String ALGORITHM…

最新!Windows 11 更新将整合 AI 技术

微软MVP实验室研究员张雅琪&#xff08;阿法兔&#xff09;微软最有价值专家&#xff08;MVP&#xff09;&#xff0c;毕业于外交学院和香港大学&#xff0c;IT 技术社区创始人&#xff0c;中关村互联网金融研究院兼职研究员&#xff0c;多次受邀在微软 Reactor 进行公开演讲&a…

JS的BroadcastChannel与MessageChannel

BroadcastChannel与MessageChannel BroadcastChannel BroadcastChannel以广播的形式进行通信 BroadcastChannel用于创建浏览器标签页之间的通信 使用BroadcastChannel的浏览器标签页面必须要遵循同源策略 页面1使用BroadcastChannel创建一个频道&#xff0c;页面2使用Broadc…

latex入门指南:插入图片、表格、公式方法一览

省事链接&#xff1a; 生成表格latex代码&#xff1a;www.tablesgenerator.com 生成公式latex代码&#xff1a;www.latexlive.com 目录1 插入图片1.1 移动标题位置1.2 双栏文章中图片横跨双栏2 插入表格2.1 常规表格2.2 设置单元格宽度2.3 合并单元格2.4 三线表2.5 移动标题位置…

脑机接口科普0018——前额叶切除手术

本文禁止转载&#xff01;&#xff01;&#xff01; 首先说明一下&#xff0c;前额叶切除手术&#xff0c;现在已经不允许做了。 其次&#xff0c;前额叶切除手术&#xff0c;发明这个手术的人居然还获得了诺贝尔奖。太过于讽刺。1949年的那次诺贝尔医学奖&#xff08;就是我…

打怪升级之发送单个UDP包升级版

目标 1.message的输入由edit_control进行&#xff0c;需要捕获输入。 2.用户的主机地址和发送地址不一样&#xff0c;需要分别设置并绑定。 设计RC外观 必备组件&#xff1a;主机IP与端口&#xff0c;从机IP与端口&#xff0c;消息框&#xff0c;发送&#xff0c;连接按钮。…

打卡小达人之路:Spring Boot与Redis GEO实现商户附近查询

在当今社会&#xff0c;定位服务已经成为了各种应用的重要组成部分&#xff0c;比如地图、打车、美食等应用。如何在应用中实现高效的附近商户搜索功能呢&#xff1f;传统的做法是将商户的经纬度信息存储在关系型数据库中&#xff0c;然后使用SQL查询语句实现附近商户搜索功能。…

Anaconda环境配置Python数据分析库Pandas的方法

本文介绍在Anaconda环境中&#xff0c;安装Python语言pandas模块的方法。 pandas模块是一个基于NumPy的开源数据分析库&#xff0c;提供了快速、灵活、易用的数据结构和数据分析工具。它的主要数据结构是Series和DataFrame&#xff0c;可以处理各种数据格式&#xff0c;如CSV、…

听客户说|东台农商银行:建立健全数据安全管理制度的探索与实践

夯实银行数据安全&#xff0c;需“规划先行、谋定后动”&#xff0c;首要工作是确立管理工作的行动纲要&#xff0c;并据此建立制度保障体系以贯彻纲要&#xff0c;而后才是具体的行动措施和日常检查、监测。从银行数据安全建设实践路径来说&#xff0c;我认为可以用“盘现状、…

markdown(.md)常用语法

markdown&#xff08;.md&#xff09;常用语法markdown常用语法常用目录标题分割线格式空格换行无序列表有序列表列表嵌套文字引用行内代码代码块字体转义斜体加粗删除线下划线功能链接todo listtypora插入图片并保存在本地包含了一些常用的MD语法和操作&#xff0c;语法不是很…

ECS 图解

旧系统执行逻辑&#xff1a;程序开发中有一个很经典的设计模式/框架 &#xff1a;MVCvc 部分是系统&#xff0c; m 是组件。 我通过名为 index 的索引访问此数据&#xff1a;现在该组件具有用于读取和写入该数据的数据。 看看源代码中的Entity 。 struct 结构体。 64位索引 &am…

STM32查看内存占用的map文件解析

STM32查看内存占用的map文件解析STM32查看内存占用的map文件解析程序内存分析在stm32中&#xff0c;通常堆向高地址增长&#xff08;向上增长&#xff09;&#xff0c;栈向低地址增长&#xff08;向下增长&#xff09;&#xff1b;1.2 flash、ROM、RAM的区别1.3 通常stm32在kei…

跨过社科院与杜兰大学金融管理硕士项目入学门槛,在金融世界里追逐成为更好的自己

没有人不想自己变得更优秀&#xff0c;在职的我们也是一样。当我们摸爬滚打在职场闯出一条路时&#xff0c;庆幸的是我们没有沉浸在当下&#xff0c;而是继续攻读硕士学位&#xff0c;在社科院与杜兰大学金融管理硕士项目汲取能量&#xff0c;在金融世界里追逐成为更好的自己。…

如何做好项目各干系人的管理及应对?

如何更好地识别、分析和管理项目关系人&#xff1f;主要有以下几个方面&#xff1a; 1、项目干系人的分析 一般对项目干系人的分析有2种方法&#xff0c; 方法一&#xff1a;权利&#xff08;影响&#xff09;&#xff0c;即对项目可以产生影响的人&#xff1b; 方法二&#xf…

终端配色-Docker容器终端

20230309 - 0. 引言 平时使用SSH&#xff0c;通常都是使用securecrt来用&#xff0c;毕竟也算是之前windows下一种使用的工具&#xff0c;在mac下使用还算方便&#xff1b;进入终端后&#xff0c;可以通过调整配色来调整编程环境。平时经常使用屎黄色的那种配色&#xff0c;毕…

Spark单机伪分布式环境搭建、完全分布式环境搭建、Spark-on-yarn模式搭建

搭建Spark需要先配置好scala环境。三种Spark环境搭建互不关联&#xff0c;都是从零开始搭建。如果将文章中的配置文件修改内容复制粘贴的话&#xff0c;所有配置文件添加的内容后面的注释记得删除&#xff0c;可能会报错。保险一点删除最好。Scala环境搭建上传安装包解压并重命…

千言数据集赛题介绍

赛题题目 通用信息抽取任务评测 将多种不同的信息抽取任务用统一的通用框架进行描述&#xff0c;着重考察相关技术方面在面对新的、未知的信息抽取任务与范式时的适应和迁移能力。 赛题介绍 信息抽取旨在将非结构化文本中的信息进行结构化&#xff0c;是自然语言处理的基础…