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;
}
相关推荐
端平入洛2 天前
delete又未完全delete
c++
端平入洛3 天前
auto有时不auto
c++
郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1234 天前
matlab画图工具
开发语言·matlab
dustcell.4 天前
haproxy七层代理
java·开发语言·前端
norlan_jame4 天前
C-PHY与D-PHY差异
c语言·开发语言
哇哈哈20214 天前
信号量和信号
linux·c++
多恩Stone4 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054964 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
遥遥江上月4 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js