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;
}
相关推荐
峥嵘life17 小时前
Android WiFi 热点 Channel 信道 和 Frequency 频率 转换总结
android·开发语言
小星星闪亮登场17 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
wgego17 小时前
基础的反序列化一些总结(php和java)
java·开发语言·笔记
梓䈑17 小时前
【用 Vibe Coding 实现的 C++17 在线判题系统】前端开发 + Web 自动化测试
前端·c++·ai编程
冻柠檬飞冰走茶17 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
TunerT_TQ18 小时前
Valhalla 静态工程审阅 #018|MMCV 源码证据驱动评测【大厂开源基础设施特辑】
c++·开源·mfc·#计算机视觉·#商汤科技·#openmmlab·#静态源码审计
山峰哥18 小时前
数据库工程与SQL调优:从慢查询到秒级响应的实战之路
java·开发语言·数据库·sql·深度优先·启发式算法
wangjialelele19 小时前
Selenium4 + Java Web自动化测试入门指南:从环境搭建到常用操作详解
java·开发语言·前端·测试工具·自动化
Awna19 小时前
Golang 大小写可见性规范
开发语言·后端·golang
别动我齐刘海19 小时前
Day6 unitree_G1人形机器人GMR—— MotionInput
c语言·c++·人工智能·学习·机器学习·机器人·github