IntArray 类为预定义的整型数组类型提供了一个有用的替代类型。如果用户希望使用一
个double 或string 类型的数组,那该怎么办呢?实现一个double 类型的数组与IntArray 类的
区别只是在其所包含的元素的类型不同,而代码本身无需改变。
C++的模板设施提供了一种机制,它能够将类成函数定义内部的类型和值参数化。
parameterizing 我们要到10.1 节才会讨论值参数,这些参数在其他方面不变的代码中
用作占位符,以后这些参数会被绑定到实际类型上,可能是内置的类型也可能是用户定
义的类型。例如在Array 类模板中,我们把数组所包含的元素的类型参数化以后,当我
们实例化instantiate 一个特定类型的实例时,如int、double 或string 类型的Array 数组,
就可以在程序中直接使用这三个实例,就好像我们已经显式地为它们编写过代码一样。现在
来看一下怎样把IntArray 类转换成Array 类模板。下面是定义
template < class elemType >
class Array {
public:
// 把元素类型参数化
explicit Array( int size = DefaultArraySize );
Array( elemType *array, int array_size );
Array( const Array &rhs );
virtual ~Array() { delete [] ia; }
bool operator==( const Array& ) const;
bool operator!=( const Array& ) const;
Array& operator=( const Array& );
int size() const { return _size; }
virtual elemType& operator[](int index){ return ia[index]; }
virtual void sort();
virtual elemType min() const;
virtual elemType max() const;
virtual int find( const elemType &value ) const;
protected:
static const int DefaultArraySize = 12;
int _size;
elemType *ia;
};
关键字template 引入模板参数由一对尖括号< > 括起来——本例中有一个参数
elemType 关键字,class 表明这个参数代表一个类型标识符,elemType 代表实际的参数名。
它在Array 类定义中出现了七次,都是作为实际类型的占位符。
在Array 类的每次实例化中,不论是实例化为int、double 或string 等等,实例化的实际
类型都将代替elemType 参数,下面的例子演示了怎样使用Array 类模板
#include <iostream>
#include "Array.h"
int main()
{
const int array_size = 4;
// elemType 变成了int
Array<int> ia(array_size);
// elemType 变成了double
Array<double> da(array_size);
// elemType变成了char
Array<char> ca(array_size);
int ix;
for ( ix = 0; ix < array_size; ++ix ) {
ia[ix] = ix;
da[ix] = ix * 1.75;
ca[ix] = ix + 'a';
}
for ( ix = 0; ix < array_size; ++ix )
cout << "[ " << ix << " ] ia: " << ia[ix]
<< "\tca: " << ca[ix]
<< "\tda: " << da[ix] << endl;
return 0;
}