C++---模板特化

模板特化

有些时候,我们写的模板不能满足所有类型的使用,所有我们在使用一些特殊类型的时候,先要手动给出该类型模板的代码,这就是模板特化。

模板参数在某种特定类型下的具体实现称为模板的特化

特化分类
  • 函数模板特化
  • 类模板特化
函数模板特化
template<typename T> 
T Max(T t1,T t2)
{
    return (t1>t2)?t1:t2;
}
#define const char* p

template<>
p Max<p>(p t1,p t2)
{
	return (strcmp(t1,t2)>0)?t1:t2;
}

函数特化的语法:

  1. template<>
  2. 函数返回值 函数名<特化类型>(函数参数列表)

如果遇到不能特化的类型,最好是将其函数原原本本的写出来,避免特化时出现问题。

类特化
template<class T1,class T2>
class Test_Template
{
public:
	Test_Template()
	{
		cout<<_data1<<_data2;
	}
private:
	T1 _data1;
	T2 _data2;
};

类特化分为两种:全特化、偏特化

  • 全特化:模板参数列表中的所有参数都给出。
template<class T1,class T2>
class Test_Template
{
public:
	Test_Template()
	{
		cout<<_data1<<_data2;
	}
private:
	T1 _data1;
	T2 _data2;
};

//全特化
template<>
//具体给出每个模板参数的类型
class Test_Template<string,string> 
{
public:
	Test_Template()
	{
		cout<<_data1<<_data2;
	}
private:
	T1 _data1;
	T2 _data2;
}
  • 偏特化分类
    • 部分偏特化(主要是参数个数)
    • 范围偏特化(参数类型为指针、引用类型)

部分偏特化
特化参数的个数小于模板参数的个数

//部分偏特化
template<class T2> //没有给出具体类型的模板参数
class Test_Template<string,T2> 
{
public:
	Test_Template()
	{
		cout<<_data1<<_data2;
	}
private:
	T1 _data1;
	T2 _data2;
}

范围偏特化

//范围偏特化,指针类型
template<class T1,class T2>
class Test_Template<T1*,T2*>
{
public:
	Test_Template()
	{
		cout<<_data1<<_data2;
	}
private:
	T1 _data1;
	T2 _data2;
}
template<class T1,class T2)
class Test_Template<T1&,T2&>
{
public:
	Test_Template(const T1& d1,const T2& d2)
	:_data1(d1)
	,_data2(d2)
	{
		cout<<_data1<<_data2;
	}
private:
	T1& _data1;
	T2& _data2;
}
int main()
{
	Test_Template<string,string> t1;//全特化
	Test_Template<string,char> t2;//部分偏特化
	Test_Template<int&,int&> t3;//范围偏特化,引用版
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值