1 第六章 模板实战
从某种意义上讲,模板是位于宏和普通声明之间的一种构造。
1.1 包含模型
我们可以用几种方法来组织模板源代码,其中最常用的就是包含模型。
所谓包含模型,其实可以有三种组织方式:
l 直接在头文件中采用内联函数的编写方式来写模板类和模板函数;(通过我在VS2005上做实验,目前只支持这种模型)
l 申明和定义分开,但是都写在头文件中;
l 将模板的声明和定义放在两个不同的文件(即.h和.cpp),然后在头文件的末尾添加上#include “xxx.cpp”即可。
一般来说,我们推荐使用第二种方式。
如果不需要考虑创建期的时间问题,我们建议尽量使用包含模型来组织模板代码。
1.2 显式实例化
包含模型能够确保所有需要的模板都已经实例化了。这是因为:当需要进行实例化的时候,c++编译系统会自动产生所对应的实例化体。
C++标准还提供了一种手工实例化模板的机制:显示实例化指示符。
1.2.1 显示实例化的例子
template void print_typeof<double>(double const&);
显示实例化指示符由关键字template和紧接其后的我们所需要实例化的实体(可以是类、函数、成员函数等)的声明组成,而且该声明是一个已经实参完全替代参数之后的声明。
对于每个不同的实体,只能显示实例化一次。
1.3 分离模型
就像像定义一般的c++类一样定义,只是在定义每个成员函数之前加上export关键字,不过从目前来看,vs2005还不支持该关键字。
所以暂时不用理会。至于书中提到的为分离模型做好准备,观点很好,但是似乎在vs2005下无法编译通过。因为我如果吧声明和定义放在两个文件,就会导致编译错误。
1.4 预编译头文件
预编译头文件的机制是位于标准之外的,主要依赖于特定产品的实现。
对于具有足够内存的系统,预编译头文件机制会使得处理速度比编译大多数单个标准头文件快很多。
管理头文件的一个可取的方法是:对预编译文件进行分层,即根据头文件的使用频率和稳定性来进行分层。
我们应该对那些属于更稳定级别的头文件进行预编译,然后在不太稳定的头文件中重用这个稳定的预编译头文件,从而提高整个编译效率。
1.5 调试模板
本节对我来说没什么用,只是其中介绍的tracer还挺有意思,有兴趣可以看看,也可以用来调试一些自己写的算法。
1.6 本章后记
包含模型是实际采用的方法,现在的c++编译器实现采用的大多就是这种方法。