C++模板参数与特化全解析

1.非类型模板参数

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

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

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

cpp 复制代码
// 1. 类型参数(最常用)
template<typename T>            // T 是类型参数
class Vector { T* data; };

// 2. 非类型参数(编译期常量)
template<int N=10>                 // N 是非类型参数
class Array { int data[N]; };

2.函数模板的特化

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

ps:如果遇到函数模板不能处理的或者有误的类型,可以直接给出函数参数

cpp 复制代码
template<class T1, class T2>
class B
{
public:
	B(T1 b1,T2 b2)
		:_b1(b1)
		,_b2(b2)
	{}
private:
	T1 _b1;
	T2 _b2;
};

//全特化
template<>
class B<char,char>
{
public:
	B(char b1, char b2)
		:_b1(b1)
		, _b2(b2)
	{}
private:
	char _b1;
	char _b2;
};

//半特化
template<class T2>
class B<char,T2>
{
public:
	B(char b1, T2 b2)
		:_b1(b1)
		, _b2(b2)
	{}
private:
	char _b1;
	T2 _b2;
};

//类的特化
template<class T1,class T2>
class B<T1*,T2*>//限制是指针
{
public:
	B(T1* b1, T2* b2)
		:_b1(b1)
		, _b2(b2)
	{}
private:
	T1* _b1;
	T2* _b2;
};

//类的特化
template<class T1, class T2>
class B<T1&, T2&>//限制是引用
{
public:
	B(T1& b1, T2& b2)
		:_b1(b1)
		, _b2(b2)
	{}
private:
	T1& _b1;
	T2& _b2;
};




int main()
{
	B<int, int>b1(1, 2);
	int a = 3;
	int b = 4;
	int* p1 = &a;
	int* p2 = &b;
	B<int*, int*>b2(p1,p2);
	B<int&, int&>b3(a,b);
	B<char, int>b4('+', b);
	B<char, char>b5('+', 'p');

	return 0;
}
相关推荐
不绝1912 小时前
C#核心:继承
开发语言·c#
大锦终2 小时前
递归回溯综合练习
c++·算法·深度优先
AI即插即用2 小时前
即插即用系列(代码实践)专栏介绍
开发语言·人工智能·深度学习·计算机视觉
码农水水3 小时前
蚂蚁Java面试被问:混沌工程在分布式系统中的应用
java·linux·开发语言·面试·职场和发展·php
喵了meme3 小时前
c语言经验分享
c语言·开发语言
晚风吹长发3 小时前
初步了解Linux中的动静态库及其制作和使用
linux·运维·服务器·数据结构·c++·后端·算法
Knight_AL3 小时前
用 JOL 验证 synchronized 的锁升级过程(偏向锁 → 轻量级锁 → 重量级锁)
开发语言·jvm·c#
啊阿狸不会拉杆3 小时前
《数字图像处理》第 4 章 - 频域滤波
开发语言·python·数字信号处理·数字图像处理·频率域滤波
风之歌曲3 小时前
c++高精度模板
c++·算法·矩阵