设计一个类,它的数据成员的类型可能根据需求变化而变化,笨方法是每一个类型都单独写一个类出来,但是这些类除了改动一些类型,其它基本一样,重复的写是很繁琐的事情,而且有时你需要的类型是你新增的,难道要再写一遍吗?
C++提供了模板语法,下面简单举个例子:
template <class T>// class 也可以写成typename
class complex
{
private:
T re,im;
public:
inline T& get_re()const{return re;}
inline T& get)_im()const{return im;}
};
这样写完只有这么一份代码,当你写complex <double> a;
这时编译器就会生成一份将T替换成double的代码。
这种写法称之为泛化。但是为了满足某些特殊需求,C++还提供了特化的语法。比如,如果数据类型是bool型,我们都知道bool在计算机中是按位储存的,因此单独为其写一份,不仅效率高,而且节省空间。
下面我们就举个例子看看特化的语法:
#include <iostream>
using namespace std:
template <class T>
class Person
{
public:
Person()
{
cout<<"泛化" <<endl;
}
};
template <>
class Person<int>
{
public:
Person()
{
cout << "全特化" << endl;
}
};
template <class T>
class Person <T*>
{
public:
Person()
{
cout << "偏特化" << endl;
}
};
int main()
{
Person<char> a;
Person<int> b;
Person<char*> c;
return 0;
}
特化又分为全特化和偏特化,全特化顾名思义它的特化程度要更高,
具体到某一个数据类型,而偏特化特化程度低,因此它只限定了部分类型,比如第三个Person,它限制非指针类型,只有传进去的模板参数是指针类型,才会使用该模板。不仅有限制数据类型的偏特化,还有限制模板参数个数的偏特化,但都大同小异,就不举例子了。