因为自己在书里看的不是很明白所以在这里写篇博客方便自己记忆和理解。
C++的类模板为生成通用的类声明提供了一种更好的方法。模板提供参数化类型,既能够将类型名作为参数传递给对方来建立类或函数。例如,将类型名int传递给Queue模板,可以让编译器构造一个对int进行排队的Queue类。
下面以Stack类为基础来建立模板。原来的类声明如下:
typedef unsigned long Item;
class Stack
{
private:
enum{MAX=10};
Item items[MAX];
int top;
public:
Stack();
bool isempty() const;
bool isfull() const;
bool push(const Item &item);
bool pop(Item & item);
};
采用模板时,将使用模板定义替换 Stack声明,使用模板成员函数替换Stack的成员函数。和模板函数一样,模板类一下面这样的代码开头:
template <class Type>
关键字template告诉编译器,将要定义一个模板。尖括号的内容相当于函数的参数列表。可以把关键字class看作是变量的类型名,改变量接受类型作为其值,把Tpye看作是该变量的名称。
这里使用的class并不意味着Type必须是一个类;而只是表明Type是一个通用的类型说明符,在使用模板时,将使用实际的类型替换他。较新的C++实现允许在这种情况下使用不太容易混淆的关键字typename代替class:
template <typename Type>
可以使用自己的泛型名代替Type,其命名规则是其他标识符相同。当前流行的选项包括T和Type,我们将使用后者。当模板被调用时,Type将被具体的类型值(如int 或string)取代,在模板定义中,可以使用泛型名来表示要储存在栈中的类型。对于Stack来说,这意味着应将声明中的所有的typedef标识符Item替换为Type。例如:
Item item[MAX];
应改为:
Type item[MAX];
同样,可以使用模板成员函数替换原有类的类方法。每个函数头都将以相同的模板声明打头:
template<class Tpye>
同样应使用泛型名Type替换typedef标识符Item。另外,还需将类限定符从Stack::改为Stack<Type>::。例如,
bool Stack::push(const Item &item)
{
...
}
应该为:
template<class Type>
bool Stack<Type>::push(const Type &item)
{
...
}
如果在类声明中定义了方法(内联定义),则可以省略模板前缀和类限定符。