-
一个模板类可以衍变成多个模板
-
局部特化
-
完全特化
类的特化有什么用?
-
有些数据是特殊形式的,特殊形式的数据在调用原模板时候可能不兼容,可以把它特殊化到一个单独的类中去实现,针对这种独立的数据类型去做处理
-
折叠参数的展开 采用特化的方式来展开
局部特化
//两个未知类型的模板类
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();
}
/*输出*/
完全特化
小丽 小美