16.3.2 作为模板的IntStack
下面是来自IntStack.cpp的容器和迭代器,是作为一般的容器类使用模板来实现的:
注意,模板会对它包含的对象做一定的假设。例如,StackTemplate假设在push()函数中有一些对T的赋值运算。可以说,模板对于它可以包含的类型“隐含着一个界面”。
表述它的另一种方法是认为模板为C++提供了一种弱类型(weak typing)机制,C++通常是强类型语言。弱类型不是坚持一个类型是某个可接受的确切类型,而是只要求它想调用的成员函数对于一个特定对象可用就行了。这样,弱类型代码适用于可以接受这些成员函数调用的任何对象,因此更灵活[1]。
这里有一个用于检测模板的修正过的例子:
惟一的不同是在实例is的创建中。在这个模板参数列表中,我们指明了栈和迭代器应当存放的类型。为了显示这个模板的一般性,我们还创建了一个StackTemplate来存放string。这是通过读入来自源代码文件的代码行来检测的。
[1]在Smalltalk和Python语言中的所有方法都是弱类型,所以这些语言不需要模板机制。实际上,我们得到了无模板的模板。