作为C++语言的新组成部分,模板引入了基于通用编程的概念。通用编程是一种无须考虑特定对象的描述和发展算法的方法,因此它与具体数据结构无关。但在决定使用C++模板之前,让我们分析一下使用模板的优缺点。


目的:
当被问及引入C++模板的目的时,C++的发明者Bjarne Stroustrup告诉我“这是为了支持类型安全、类容器的有效性和算法的通用性”。

优势和劣势:
使用模板有很多原因,最主要的为了得到通用编程的优点。国际标准化组织(ISO)为C++建立了C++标准库,该标准库功能强大,这证明了模板的重要性。库中涉及算法和容器的部分组成了标准模板库(简称STL)。由于模板的可重用性和可扩展性,你可以利用STL来实现效率很高的代码。

但是模板也有一些不太为人知的缺点。首先,由于C++没有二进制实时扩展性,所以模板不能像库那样被广泛使用。模板的数据类型只能在编译时才能被确定。因此,所有用基于模板算法的实现必须包含在整个设计的头文件中。通过分析标准模板库(STL)的头文件,你可以很清楚的认识到这一点。

另外,由于模板只是最近加入C++标准中,所以有些C++编译器还不支持模板,当使用这些编译器时编译含有模板的代码时就会发生不兼容问题。例如,Mozilla浏览器开发组之所以没有使用模板就是因为交叉平台会导致模板的不兼容。同样的,如果当开发者需要跨越好几个平台而有的平台可能只有老的C++编译器的时候,使用模板也是不明智的。

即使到现在,模板的一些高级特性,例如局部特殊化和特殊化顺序在不同的C++标准实现中也还是不统一的。

尽管如此,结合STL使用模板还是可以大大减少开发时间。模板可以把用同一个算法去适用于不同类型数据,在编译时确定具体的数据类型。

比方说,假设你希望实现一个诸如TCP/IP堆栈所用的开窗重排序机制。这个机制可用于IP数据报和其它数据报格式。通过使用模板后,开窗重排序机制就像流控制那样,无须随所处理数据格式而改变。

C++模板的标准用法
头文件和名字空间

标准C++包含了名字为std的名字空间的所有标准库和函数。下文中例子将使用与它们相关联的头文件:

#include <iostream>
using namespace std;

这里,我们包含了 iostream库在全局范围内说明了std名字空间。

说明、例化和参数化模板类:

第一件要考虑的事是如何定义一个简单的模板。我们假定你有C++的基本知识但是从没有接触过类属编程和模板。在清单A中,我们说明了一个模板。在清单B中,我们建立了一个实例来调用这个函数。

清单B中,foo模板的第一个实例将输出bar 97,第二个实例将输出bar a。这是因为模板是在编译时被解释的。与之相比,C++中类的数据类型必须在说明时就精确指定。

说明和参数化模板函数:

C++也可以说明模板函数。当编写一个处理对象的数据类型又很多种的算法时,模板函数的概念就显得很重要。我们将举一个模板函数的例子。

在In 清单C中,你会发现函数的定义兼有标准C(ANSI C)和模板类的特点。我们可以用不同的参数来调用这个函数,如清单D代码所示。

清单D中,第一个被调用的函数将输出b,这是因为参数是字符型。而第二个函数的参数是整数型,所以输出是98。

C++模板还有更多的标准用法,如模板参数、类型等价、模板重载等。参考书目覆盖了上述内容。我们就不再予以讨论。

文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/c++/cppjs/20100705/334165.html

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐