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;
}
相关推荐
Laurence19 分钟前
Qt 前后端通信(QWebChannel Js / C++ 互操作):原理、示例、步骤解说
前端·javascript·c++·后端·交互·qwebchannel·互操作
岁岁种桃花儿22 分钟前
AI超级智能开发系列从入门到上天第四篇:AI应用方案设计
java·服务器·开发语言
王老师青少年编程26 分钟前
2026年3月GESP真题及题解(C++五级):有限不循环小数
c++·题解·真题·gesp·csp·五级·有限不循环小数
Amnesia0_028 分钟前
C++中的IO流
开发语言·c++
2401_8914821729 分钟前
C++模块化编程指南
开发语言·c++·算法
暮冬-  Gentle°30 分钟前
自定义类型转换机制
开发语言·c++·算法
2301_8166512242 分钟前
嵌入式C++低功耗设计
开发语言·c++·算法
czlczl200209251 小时前
JVM创建对象过程
java·开发语言
qq_416018721 小时前
分布式缓存一致性
开发语言·c++·算法
SuperEugene1 小时前
Vue Router 实战规范:path/name/meta 配置 + 动态 / 嵌套路由,统一团队标准|状态管理与路由规范篇
开发语言·前端·javascript·vue.js·前端框架