14.3.2 泛型编程
在C++中,模板是泛型编程的基础。实际上,C++中“泛型编程”的定义就是“使用模板”,虽然这样的定义有点太简单化了。我们不应根据编程语言特性定义基本的编程概念。编程语言特性主要用于支持编程技术——而不是相反。和其他流行概念一样,“泛型编程”存在多种定义。我们认为简单的、最有用的定义是:
泛型编程(generic programming):编写能够正确处理以参数形式呈现的各种类型的代码,只要这些参数类型满足特定的语法和语义要求。
例如,vector的元素必须是可拷贝的类型(通过拷贝构造和拷贝赋值)。在第15和16章中,我们将介绍要求其参数能进行算术运算的模板。当参数化的是一个类时,我们将得到一个类模板(class template),通常也称为参数化类型(parameterized type)或者参数化类(parameterized class)。当参数化的是一个函数时,我们将得到一个函数模板(function template),通常也称为参数化函数(parameterized function),有时也称为算法(algorithm)。因此,泛型编程有时称为“面向算法的程序设计”,设计重点在于算法而非算法所使用的数据类型。
由于参数化类型的概念是编程的核心,我们需要进一步探讨这个有些让人困惑的术语。这样,当我们在其他场合中再次碰到这一概念时,才有可能不对它太过困惑。
这种依赖于显式模板参数的泛型编程通常被称为参数化多态(parametric polymorphism)。相反,从类层次与虚函数获得的多态被称为即时多态(ad hoc polymorphism),而这种编程风格被称为面向对象编程(object-oriented programming,见19.3~19.4节)。之所以两类编程都被称为多态(polymorphism),是因为每种类型都依赖于程序员通过一个单一接口表示一个概念的多个版本。多态在希腊语中是“多种形状”的意思,这表示很多不同的类型,你可以通过一个公共接口操纵它们。在第12~14章及第21章的Shape例子中,我们可以通过Shape定义的接口访问多种形状(如Text、Circle和Polygon)。当我们使用vector时,我们通过vector模板定义的接口使用多种vector(如vector<int>、vector<double>和vector<Shape*>)。 ...