【C++】模板类、特化以及偏特化!!!

模板类的定义和模板函数的定义类似,同样是已template的形式定义的。

举个栗子:

template
class Example
{
public:
	Example()
		:data(NULL)
	{}
	Example(const T& d)
		:data(d)
	{}
	~Example()
	{}
private:
	T* data;
};
注意:在模板参数列表里面使用class和typename效果是一样的,即可以使用class来替换typaname。


同样,在调用的时候模板类直接实例化出来这个模板类的对象,和模板函数里面是一样的,模板类只是一个模板,在调用的时候才会创建出来所需要的类型的对象。

例如:

int main()
{
	Example a1;
	Example a2;
	Example a3;
	return 0;
}
上面的代码分别创建了三个不同的类型的对象------>当模板类被调用的时候模板类就会根据所调用类型进行实例化,和模板函数的调用类似。

注:模板类和模板函数最大的区别就是在模板类里面可以将模板参数设置成带缺省的参数,但是在模板函数里面是不可以定义带缺省的参数的模板函数的。

模板类的特化:
   在模板类里面同样存在的模板的特化,举个栗子:

template
class Example
{
public:
	Example()
		:data(NULL)
	{}
	Example(const T& d)
		:data(d)
	{}
	~Example()
	{}
private:
	T* data;
};
                         //特化模板类为int型
template<>
class Example
{
public:
	Example()
		:data(NULL)
	{}
	Example(const int& d)
		:data(d)
	{}
	~Example()
	{}
private:
	int data;
};

偏特化:

在有的场景下我们只需要特化一个模板类的模板参数就可以了,这样就可以使用模板类里面的偏特化。
例如:

template
class Example
{
public:
	Example()
	{}
private:
	T1* data1;
	T2*	data2;
};


template<>
class Example    //偏特化模板类的第二个参数为int
{
public:
	Example()
	{}
private:
	T1* data1;
	int* data2;
};

模板以及模板特化的优缺点:

优点:模板是的代码的复用率很高,更加的节省资源,使得代码的多样性更加的丰富。

缺点:在代码的里面使用模板使得代码看起来非常的凌乱,而且使得代码的可读性很低,同时在写代码的时候模板很容易出现错误,不易查找代码的错误。


你可能感兴趣的:(C\C++)