C++模板(泛化),特化,偏特化

1、模板特化按对象类型可分为类模板特化和全局模板函数函数特化;

2、按特化类型可分为全特化和偏特化(偏特化包括范围偏特化和参数数量偏特化),全局模板函数不支持偏特化(因为函数有重载,所以函数偏特化都是重载);

3、特化的优先级高于泛化(编译器会先去匹配特化和偏特化,后去匹配泛化)。

类模板特化

template <typename T1, typename T2>
class testFun 
{
public:
	testFun(T1 t1, T2 t2) : a(t1), b(t2) 
	{
		cout << "类模板" << endl;
	}
private:
	T1 a;
	T2 b;
};
//全特化
template <>
class testFun<int, string>
{
public:
	testFun(int t1, string t2) : a(t1), b(t2)
	{
		cout << "全特化" << endl;
	}
private:
	int a;
	string b;
};
//参数数量偏特化
template <typename T2>
class testFun<int, T2>
{
public:
	testFun(int t1, T2 t2) : a(t1), b(t2)
	{
		cout << "参数数量偏特化" << endl;
	}
private:
	int a;
	T2 b;
};

template <typename T1, typename T2>
class testFun<T1*, T2*>
{
public:
	testFun(T1* t1, T2* t2) : a(t1), b(t2)
	{
		cout << "范围偏特化,指针偏特化" << endl;
	}
private:
	T1* a;
	T2* b;
};

template <typename T1, typename T2>
class testFun<T1 const, T2 const>
{
public:
	testFun(T1 t1, T2 t2) : a(t1), b(t2)
	{
		cout << "范围偏特化,const偏特化" << endl;
	}
private:
	T1 a;
	T2 b;
};

函数模板特化

上面说到函数模板不支持偏特化,若强行写偏特化(重载),当同时写下特化和偏特化,若全特化的部分参数和偏特化的一致,则会给重载,退化为偏特化()

//函数模板
template<typename T1, typename T2>
void testfun(T1 ta, T2 t2) {
	cout << "模板函数" << endl;
}
//全特化1,会被重载,退化为偏特化
template<>
void testfun(char ta, string t2) {
	cout << "全特化" << endl;
}
//全特化2,不会被重载
template<>
void testfun(int ta, string t2) {
	cout << "全特化" << endl;
}
//偏特化(重载)
template<typename T2>
void testfun(int t1, T2 t2) {
	cout << "偏特化" << endl;
}
/*不支持const范围偏特化
template<typename T1, typename T2>
void testfun(T1 const t1, T2 const t2) {
	cout << "const偏特化" << endl;
}*/
template<typename T1, typename T2>
void testfun(T1* t1, T2* t2) {
	cout << "指针偏特化" << endl;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值