更多 C++ 惯用法/瘦模板
外观
当类模板为多种类型实例化时,减少目标代码重复。
模板是重用源代码,而不是目标代码的方式。一个模板可以为一整类类定义。该家族中的每个被实例化的成员都需要自己的目标代码。每当实例化类或函数模板时,都会为该特定类型生成目标代码。参数化类型的数量越多,生成的目標代码就越大。编译器只为程序中使用的类模板函数生成目标代码,但重复的目标代码仍然可能在内存资源不充裕的环境中成为问题。重用相同的目标代码还可以提高指令缓存性能,从而提高应用程序性能。因此,减少重复的目标代码是可取的。
瘦模板惯用法用于减少重复的目标代码。目标代码级别的可重用代码只编写一次,通常在基类中,并在可单独部署的 .dll 或 .so 文件中编译。此基类不是类型安全的,但类型安全的“瘦模板”包装器添加了缺少的类型安全,而不会造成太多(或任何)目标代码重复。
// Not a template
class VectorBase {
void insert (void *);
void *at (int index);
};
template <class T>
class Vector<T*> // Thin template
: public VectorBase
{
inline void insert (T *t) {
VectorBase::insert (t);
}
inline T *at (int index) {
return static_cast<T*>(VectorBase::at (index));
}
};
基类可能是“胖”的:它可能包含任意数量的代码。由于基类只使用非内联函数,因此它的代码只生成一次。但由于类型转换被封装在类模板中的内联函数中,因此该类对用户来说是类型安全的。模板类是“瘦”的,因为它在每次模板实例化时不会生成太多代码。
Symbian OS 很大程度上依赖于这种惯用法。例如,
template <class T> class CArrayFix : public CArrayFixBase
其中 CArrayFixBase 完成了所有工作