c++模板 --- 类模板特化

本文探讨了类的局部特化和完全特化在编程中的应用,如何处理特殊数据类型,以及它们在折叠参数展开中的作用。通过实例展示了如何使用局部特化MM类来优化数据打印,并对比了与完全特化的区别,重点在于提高代码的灵活性和效率。
摘要由CSDN通过智能技术生成
  • 一个模板类可以衍变成多个模板

  • 局部特化

  • 完全特化

类的特化有什么用?

  • 有些数据是特殊形式的,特殊形式的数据在调用原模板时候可能不兼容,可以把它特殊化到一个单独的类中去实现,针对这种独立的数据类型去做处理

  • 折叠参数的展开 采用特化的方式来展开

局部特化

//两个未知类型的模板类
template <class _Ty1,class _Ty2>
class MM 
{
public:
	MM(_Ty1 one, _Ty2 two) :one(one), two(two) {}
	void print() 
	{
		cout << one << " " << two << endl;    //原来的数据打印方式 自定义类型需要重载
	}                                         
protected:
	_Ty1 one;
	_Ty2 two;
};
class Data                         
{
public:
	Data(int a, int b) :a(a), b(b) {}
	void print() 
	{
		cout << a << " " << b << endl;        //以自定义类型为参数调用不了模板
	}
protected:
	int a;
	int b;
};

//局部特化 特殊化 两个未知类型特化成一个未知类型
template <class _Ty>
class MM<_Ty,_Ty> //特化产生的类 类名需要用: 类名<类型> 方式使用
{
public:           
	MM(_Ty one, _Ty two) :one(one), two(two) {}
	void print()
	{
		//1.cout << one << " " << two << endl;	 //不采用统一的格式打印数据
        //2.特化处理
        one.print();
        two.print();    //可以传两个类的对象类型进来 调用各自类对象的方法去打印数据
        cout << "特殊化" << endl;
	}
protected:
	_Ty one;
	_Ty two;
};

int main() 
{
    //调用原生模板
	MM<string, int> mm1("小芳", 18);
	mm1.print();
    
    //调用局部特化模板
    MM<string, string> mm2("小丽","小美");  
    mm2.print();

	MM<Data, Data> dMM(Data(1,2),Data(3,4));
    dMM.print();        //针对特殊的数据做特殊的处理
	return 0;
}
/*输出*/

小芳 18
小丽 小美
特殊化
1 2
3 4
特殊化

完全特化(相当于具体化)

template <class _Ty1,class _Ty2>
class MM 
{
public:
	MM(_Ty1 one, _Ty2 two) :one(one), two(two) {}
	void print() 
	{
		cout << one << " " << two << endl;
	}
protected:
	_Ty1 one;
	_Ty2 two;
};

//完全特化
template <>                  //模板类没有未知类型 两个未知类型都具体化
class MM<string, string>     //需要传入具体的类型 对 <string, string> 做单独的处理
{
public:
	MM(string one, string two) :one(one), two(two) {}
	void print()
	{
		cout << "完全特化" << endl;
		cout << one << " " << two << endl;
	}
protected:                   //仍是一个模板类 在构造这种类型的对象时会调用特化后的模板
	string one;
	string two;
};
int main()
{
    //调用完全特化的模板---在折叠参数中有用
    MM<string, string> mm2("小丽","小美");  
    mm2.print();
}

/*输出*/

完全特化
小丽 小美
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiuqiuyaq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值