模板--进阶

1.0 非类型模板参数

顾明思意,指的是不表示为类型的模版,常常用于当成常量用于使用,绝大多数情况都是使用整形家族来使用。

template <class T,int N = 10>
class A
{
	T a;
	int b[N];
};
int main()
{
	A<char> a1;
	A<char,100> a2;
	return 0;
}

需要注意的是,非类型的模板参数也可以使用缺省值,此外非类型参数的本质实际上是常量,所以不能被修改,只能在声明实例化时确定其值。

2.0 模板的特化

模板特化的使用是在原模板类的基础上针对特殊类型所进行特殊化的实现方式,有点类似于函数重载。模板特化中分为函数模板特化与类模板的特化。

2.1函数模板特化

针对特殊的类型,函数模板可以使得在调用函数时,将特殊类型的变量进行特殊处理。

  • 对特殊类型的处理时即使不使用模板的变量,也同样要使用模板template + <> 的形式来使用。
  • 函数模板特化的使用需要基于先有原函数模版才能使用。
template <class T>
void fuc(T x, T y)
{
	;
}

template <>
void fuc(string x, string y)//对string类型特殊化处理
{
	;
}

2.2类模板特化

类的模板的使用条件同理函数模板,作用也是针对特殊类型的处理。

  • 使用类模板特化前,需要有一个原类模板。
  • 类模板特化前应使用template + <>,<>中是否使用类模板参数取决于对类模板特化的处理。
  • 类模板特化的类名后接<>,<>中为对应类型的特化处理。
template<class T1 ,class T2>//原模板
class A
{
public:
	A()
	{
		cout << "A <T1 ,T2>" << endl;
	}
};

template <>//全特化模板
class A<int,int>//对于两个参数都为int类型的进行特殊化处理
{
public:
	A()
	{
		cout << "A <int ,int>" << endl;
	}
};

template <class T>//偏特化模板
class A<T, char>//对于第二个参数为char类型的类进行特殊化处理
{
public:
	A()
	{
		cout << "A <T ,char>" << endl;
	}
};

类模板的特化又分为两种形式,一种是全特化,另一种为偏特化,也就是部分类型的特殊化处理

  1. 全特化:对模板中的全部参数都特殊化处理。
  2. 偏特化:将模板中的部分参数特殊特殊化处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值