第8章 编写泛型函数

时间:2022-05-07 19:25:12

模板:前面我们已经用过了标准库的一些设施,例如std::vector。可以发现,通过使用<>传递不同的类型,我们能够创建承载不同类型的动态数组。C++为我们提供了这样将类型作为参数的机制,这就是模板。

 

模板函数:通过C++提供的模板机制,我们可以编写函数族。既然称为族,那么它就不是一个单独的函数个体,而是一个集体。当我们通过编写函数来实现某一个功能的时候,可能我们还需要编写另外一个函数实现同样的功能(实现过程相同),但是它所操作的类型不同,那么我们就可以利用C++的模板机制编写一个函数,将所操作的类型作为未知的参数,而不需要编写多个,这样的函数就被成为模板函数。我们使用过的标准库算法都是一些模板函数(也就是泛型函数)。

 

编写一个泛型函数是很容易的,但是要编写一个抽象能力强的泛型函数还是需要花费一些功夫进行思考的。一个泛型函数要够“泛”才能够具备强的抽象能力,但是在力求“泛”的同时也得根据这个函数的功能进行必要的约束,这两方面是相互对立的,所以我们得好好的权衡。

 

标准库具有多种容器,每种容器的内部结构和特性都不同,标准库提供了很多方便的泛型算法,但是这些算法要做到能够应用到每种容器上的话,仅仅是理解了模板技术是不够的,还需要通过这些技术来构建一种能力强大的抽象来让他们能够很好的粘合。标准库的做法是提供了一种叫做“迭代器”的抽象,它就是不同容器与各种泛型算法之间的粘合剂。“迭代器”并不是某种类型的名字,而是一种抽象概念,标准库提供了多种迭代器类型,而我们的指针也是一种迭代器,通过这个抽象概念那我们就可以让泛型算法作用于标准库容器,甚至是底层的数组。