天天看点

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

  • 一个模板类可以衍变成多个模板
  • 局部特化
  • 完全特化

类的特化有什么用?

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

局部特化

//两个未知类型的模板类
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();
}

/*输出*/

完全特化
小丽 小美
           

继续阅读