模板进阶(包含特化)

news2024/12/23 14:29:53

非类型模板参数

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

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

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

#include<iostream>
#include <array>
#include <string>
using namespace std;


// 静态数组
// 非类型模板参数 -- 常量
template<class T, size_t N>
class Array
{
private:
	T _a[N];
};

int main()
{
	Array<int, 10> a1;
	Array<int, 100> a2;

	return 0;
}

​

以上是利用类封装的静态数组。

注意:

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

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

模板的特化

通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结 果,需要特殊处理,

比如:实现了一个专门用来进行小于比较的函数模板

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

结果正确。

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

类模板特化

全特化

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

偏特化

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

偏特化有以下两种表现方式:

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

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

类模板特化实现

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

//全特化
template<>
class A<char, int>
{
public:
	A()
	{
		cout << "A:char  int(全特化)" << endl;
	}
};

//偏特化——部分特化
template<class T>
class A<char, T>
{
public:
	A()
	{
		cout << "A:char  T(偏特化)" << endl;
	}
};

//偏特化——对参数的进一步限制
template<class T1, class T2>
class A<T1*, T2*>
{
public:
	A()
	{
		cout << "A:char  int(限制参数类型为指针)" << endl;
	}
};

template<class T1, class T2>
class A<T1&, T2&>
{
public:
	A()
	{
		cout << "A:char  int(限制参数类型为引用)" << endl;
	}
};



int main()
{
	A<int, int> a1;
	A<char, int> a2;
	A<char, char> a3;
	A<int*, int*> a4;
	A<int&, int&> a5;



	return 0;
}

 

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

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

相关文章

CSS(基础,面试,常见用例)

CSS规则【*】CSS选择器一、 CSS选择器二、选择器匹配原理三、优先级 / 权重四、可继承 / 不可继承样式属性【*】盒模型一、盒模型二、box-sizing属性三、offsetWidth、clientWidth、scrollWidth**【*】em/px/rem/vh/vw的区别一、CSS单位二、px三、em四、rem五、vh、vw六、%百分…

基于spring生态的基础后端开发及渗透测试流程

这是一篇记录如何从建仓开始到最后安全测试完整流程的笔记&#xff0c;使用的spring生态&#xff0c;目的是为spring的基础后端开发及后期渗透测试打一个模板。本篇采用springSecurity作为安全框架&#xff0c;搭载了redis-cache、spring-valid等功能&#xff0c;并开放了OAuth…

实测十款连锁店管理系统,专为纠结的连锁店老板打造!

普通的数据工具、人工管理难以满足连锁店老板们的需求&#xff0c;正所谓“有需求就有市场”&#xff0c;随着连锁店、加盟店如雨后春笋般在城市里出现&#xff0c;连锁店管理系统也越来越多。究竟哪一款连锁店管理系统&#xff0c;才能满足老板们的需求&#xff1f;不用纠结了…

park unpark 原理

1、基本使用 // 暂停当前线程 LockSupport.park();// 恢复某个线程的运行 LockSupport.unpark(暂停线程对象) 先 park 再 unpark public class Test1 {public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(() -> {log.debug(&q…

「自控元件及线路」1.2 电机中的磁性材料与磁场

本节介绍磁性材料的性能、分类 本节介绍电机中永磁材料的工作曲线 本节介绍电机中主磁极、电枢的磁场及电枢反应 文章目录磁性材料的基本概念磁性材料的磁性能高导磁性 饱和性 磁滞性 非线性温度特性 电阻率特性铁耗磁性材料的分类电机中的永磁材料永磁电机概述永磁材料的磁性能…

mysql:聊聊mysql学完之后心得,从哪里学,学哪些,怎么选课程,学到什么程度。

mysql&#xff1a;聊聊mysql学完之后心得&#xff0c;从哪里学&#xff0c;学哪些&#xff0c;怎么选课程&#xff0c;学到什么程度。 学习完一套课程之后习惯性总结一下。首先说一下&#xff0c;咕咕是跟着尚硅谷的康老师学习的mysql&#xff0c;大家想学习的话可以直接去b站…

Java文件IO操作及案例

文章目录一. 文件概述1. 狭义和广义上的文件2. 文件的分类3. 文件的路径二. 针对文件系统的操作1. File类的属性和构造2. File类的获取操作3. File类的判断操作4. 文件的创建和删除5. 其他的常用方法三. 对文件内容进行读写1. IO流对象2. 文件的读操作3. 文件的写操作4. Scanne…

vim使用入门

目录vim模式介绍1.1 模式介绍1.2 模式之间切换1.3 进入vim1.4 退出vimvim模式介绍 1.1 模式介绍 vim具有6种基本模式和5种派生模式。 6种基本模式如下&#xff1a; 普通模式 vim启动后的默认模式。使用编辑器命令&#xff0c;比如移动光标&#xff0c;删除文本等等 普通模式进…

智能指针(二)—— unique_ptr、shared_ptr 的简单模拟实现

智能指针其实就是资源管理权限的转移&#xff0c;自己不想手动释放&#xff0c;交给一个对象管理&#xff0c;对象什么时候被销毁&#xff0c;这块资源也就什么时候被释放。unique_ptr 、shared_ptr 和weak_ptr 之间的区别如下&#xff1a; unique_ptr&#xff1a;字面意思是…

非全研究生开题-室内定位最新研究论文总结-1

序言 时间飞逝,23年3月底之前要把开题报告和综述写好。开学后研究了2个方向:serverless冷启动和室内定位; 春节期间在这2个选题之间犹豫不决,不断在心里面分析 经过反复比较对比,决定研究室内定位,也可以为后续完善产品,甚至后面创业打下基础。 后面我会持续深入,在…

【数据结构】链表必做题

写在开头学完链表&#xff0c;我们就要适当做一些题目来巩固知识&#xff0c;下面的一些精选题难度适中&#xff0c;很适合初学者练手。做题之前我们来了解一点概念&#xff0c;就是链表调用传参时&#xff0c;我们什么时候使用一级指针&#xff0c;什么时候使用二级指针&#…

在Linux上安装Maven和配置Maven仓库(v3.8.7)

记录&#xff1a;369场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;使用apache-maven-3.8.7安装Maven和配置Maven仓库。版本&#xff1a;JDK 1.8apache-maven-3.8.7名词&#xff1a;Apache Maven&#xff1a;Apache Maven is a software project management and comprehe…

31_内存马

内存马 一、php内存马(不死马) 原不死马文件是生成一个一句话木马文件之后,自动删除自身,并且抑制报错 即使删除生成的一句话木马文件 也会不断的继续生成一句话木马文件 除非重启服务,才能停止继续生成 <?php error_reporting(0);//抑制报错 unlink(__FILE__);//删除…

【工具】iOS代码混淆工具-iOS源码混淆

最新更新记录 V2.0.3&#xff08;2022年12月11日&#xff09;更新内容&#xff1a; 1、新增导入映射列表的逻辑&#xff1b; 2、优化修复其他混淆逻辑&#xff1b; 3、更新地址 - github 主要功能 ZFJObsLib是专业的iOS源码混淆工具&#xff0c;具体功能有方法混淆、属性…

AcWing 1082. 数字游戏(数位DP)

AcWing 1082. 数字游戏&#xff08;数位DP&#xff09;一、问题二、数位DP三、思路分析四、代码一、问题 二、数位DP 这道题是在一个区间内挑选满足某个条件的数&#xff0c;这是一个非常典型的数位DP的特点。 这道题是一道数位DP的题目&#xff0c;其实数位DP更像我们在高中…

5-TAMRA-TSA,5-TAMRA-Tyramide,5-四甲基罗丹明-酪酰胺

【中文名称】5-四甲基罗丹明-酪酰胺&#xff0c;5四甲基罗丹明酪酰胺【英文名称】 5-Tamra-Tyramide&#xff0c;5-TAMRA-Tyramide&#xff0c;5-Tamra-TSA&#xff0c;5-TAMRA-TSA【CAS】N/A【纯度标准】95%【包装规格】5mg&#xff0c;10mg&#xff0c;25mg【是否接受定制】可…

spring springboot关于异步线程实践案例

前言&#xff1a; 关于多线程的异步处理&#xff0c;由于项目的需求有个方法需要使用异步的方法来调用&#xff0c;方法是调用外部的接口&#xff0c;执行时间会比较长导致的没有办法同步拿去到结果&#xff0c;所以需要写一个异步线程的方法进行该接口的调用&#xff0c;下面是…

Unity - UI适配方案记录

1.普通屏不同分辨率适配及预览 1.背景图 界面背景图建议至少宽于21:9&#xff1b;其中16:9的范围为精细范围&#xff0c;12:9的范围为真机最小可见范围。 2.组件 各组件通过设置RectTransform属性来达到正确适配的效果。 3.预览 在unity中&#xff0c;设置Game窗口左上角…

【C++入门第一期】命名空间 缺省参数 函数重载 的使用方法及注意事项

目录简介命名空间为何会有命名空间命名空间的定义嵌套定义命名空间的使用作用域限定符using 将命名空间中某个成员引入using namespace 将该空间所有成员引入缺省参数全缺省参数函数半缺省参数函数如何给缺省值函数重载函数重载的概念函数重载的三种类型1&#xff1a;函数参数类…

【蓝桥日记①】2017第八届省赛(软件类)JavaA组❤️答案解析

【蓝桥日记①】2017第八届省赛&#xff08;软件类&#xff09;JavaA组❤️答案解析 文章目录【蓝桥日记①】2017第八届省赛&#xff08;软件类&#xff09;JavaA组❤️答案解析A、迷宫B、9数算式C、魔方状态D、方格分割E、字母组串F、最大公共子串G、正则问题H、包子凑数I、分巧…