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;
}
相关推荐
独好紫罗兰几秒前
对python的再认识-基于数据结构进行-a006-元组-拓展
开发语言·数据结构·python
冉佳驹3 分钟前
C++ ——— 异常处理的核心机制和智能指针管理
c++·异常捕获·异常继承体与多态·重载抛异常·raii思想·智能指针shared_ptr·weak_ptr指针
C++ 老炮儿的技术栈5 分钟前
Qt 编写 TcpClient 程序 详细步骤
c语言·开发语言·数据库·c++·qt·算法
yuuki23323315 分钟前
【C++】继承
开发语言·c++·windows
222you16 分钟前
Redis的主从复制和哨兵机制
java·开发语言
牛奔22 分钟前
如何理解 Go 的调度模型,以及 G / M / P 各自的职责
开发语言·后端·golang
梵刹古音23 分钟前
【C++】 析构函数
开发语言·c++
wangjialelele40 分钟前
Linux下的IO操作以及ext系列文件系统
linux·运维·服务器·c语言·c++·个人开发
Sylvia-girl1 小时前
IO流~~
java·开发语言
打工哪有不疯的1 小时前
使用 MSYS2 为 Qt (MinGW 32/64位) 完美配置 OpenSSL
c++·qt