一、概述
模板的意义在于将类型参数化,类模板就是将成员(包括数据成员、成员函数)的类型参数化,提高代码的复用性。
二、类模板定义
常见的类模板定义方式如下:
template<typename T>
class TemplateName
{
public:
TemplateName<T>();
TemplateName<T>(const TemplateName<T> &val);
T GetVal();
void SetVal(T val);
~TemplateName<T>();
private:
T _val;
}
需要注意的是在此代码中,TemplateName是模板名字,TemplateName<T>才是类名,在声明或定义构造函数和析构函数时,可以不加<T>,其他情况均需要加上<T>,好的习惯是都加上<T>。
三、类成员定义
在类内定义成员时,将T看作是一个类类型就行,在类外定义成员函数时,需加上类名::,比如
template<typename T>
T TemplateName<T>::GetVal(){
return _val;
}
四、类模板的选择性实例化
在实际使用类模板时,类模板的成员并不会都实例化,编译器会根据使用的成员进行选择性实例化,比如像如下方式调用类模板代码时:
int main()
{
TemplateName<int> s;
s.SetVal(1);
return 0;
}
编译器会只实例化模板类Template<int>的TemplateName<int>()和SetVal成员函数,而另一个构造函数和GetVal函数则不会实例化,也就是说编译器不会生成对应的代码来进行编译。