template // size-independent base class for class SquareMatrixBase { // square matrices protected: ... void invert(std::size_t matrixSize); // invert matrix of the given size ... };
template< typename T, std::size_t n> class SquareMatrix: private SquareMatrixBase { private: using SquareMatrixBase::invert; // avoid hiding base version of // invert; see Item 33 public: ... void invert() { this->invert(n); } // make inline call to base class }; // version of invert; see below // for why "this->" is here
就像你能看到的,invert 的参数化版本是在一个 base class(基类)SquareMatrixBase 中的。与 SquareMatrix 一样,SquareMatrixBase 是一个 template(模板),但与 SquareMatrix 不一样的是,它参数化的仅仅是矩阵中的对象的类型,而没有矩阵的大小。因此,所有持有一个给定对象类型的矩阵将共享一个单一的 SquareMatrixBase class。从而,它们共享 invert 在那个 class 中的版本的单一拷贝。