知识点:
1、类模板形式 template< typename elemType> class T ,其中typename可以替换为class,写成template< class elemType> class T。 调用形式:T< string>t1
2、typename:用在模板定义里,标明其后的模板参数是类型参数。
3、常量表达式与默认参数值:Template的参数并不是非得某种类型不可,也可以用常量表达式(constant expression)作为参数。例如,template<int a,int b=1>class T,调用时为 T<32,1> t2.
4、Member Template Function(成员模板函数),即将类的成员函数定义成Template形式,其中类可以是普通类,也可以模板类。
5、new表达式和delete表达式:用以管理内存分配和释放。primer 12.1.2节详解。new返回一个指针,delete接收一个指针。
练习6.1
试改写以下类,使之成为一个class template:
class example{
public:
example(double min, double max);
example(const double *array, int size);
double& operator[](int index);
bool operator==(const example&) const;
bool insert(const double*, int);
bool insert(double);
double min() const {
return _min; }
double max() const {
return _max; }
void min(double);
void max(double);
int count(double value) const;
private:
int size;
double *parray;
double _max;
double _min;
};
解:要将某个class转换为一个class template,我们必须找出所有和类型相关的部分,并且剥离出来。本例中,_size 的类型是int,用户会不会指定为其他类型呢?不会,因为 size用来记录 _parray所指数组的元素个数,其类型不会变动。至于_parray,就有可能指向不同类型的元素,如int ,double,float,string等,因此必须将_parray,_min,_max这些数据类型予以参数化。
由于elemType 现在可能被用来表现内置类型或class类型,因此以传址(by reference)方式而非传值(by value)方式比较好
template <typename elemType>
class example{
public:
example(const elemType &min, const elemType &max);
example(const elemType *array, int size);
elemType& operator[](int index);
bool operator==(const example&) const;
bool insert(const elemType*, int);
bool insert(const elemType&);
elemType min() const {
return _min; }
elemType max() const {
return _max; }
void min(const elemType&);
void max(const elemType&);
int count(const elemType &value) const;
private:
int size;
elemType *parray