模板递归template recursion 一、引入 我们前面编写的Grid类模板最多支持二维数组,当我们想要获得更多维的数组时,必须要重新编写代码和规划。正如N维数组是N-1维数组的数组,这里面存在这一个递归的定义,在模板中同样也支持模板递归。 template<typename T> class OneDGrid { public: OneDGrid( int inSize=kDefaultSize ); OneDGrid( const OneDGrid<T>& src ); ~OneDGrid( ); OneDGrid<T>& operator=( const OneDGrid<T>& rhs ); void resize( int newSize ); T& operator[ ]( int x ); const T& operator[ ]( int x ) const; int getSize( ) const {return mSize;} static const int kDefaultSize=10; protected: void copyFrom( const OneDGrid<T>& src ); T* mElems; int mSize; }; 有了上面的代码,我们就可以定义一个多维的数组: OneDGrid<int> singleDGrid; OneDGrid<OneDGrid<int> > twoDGrid; OneDGrid<OneDGrid<OneDGrid<int> > > threeDGrid; singleDGrid[ 3 ]=5; twoDGrid[ 3 ][ 3 ]=5; threeDGrid[ 3 ][ 3 ][ 3 ]=5; 二、正文 就像我们所熟知的其他递归一样,递归模板也要有一个出口。 上面的代码是能够编译并运行的,但是声明的方式比较麻烦。C++有更好的方法,可以使用户自定义维数和每一维的长度,下面实现的方法 维数和每一维的长度相同。编写完成以后,我们就可以这样定义: NDGrid<int,3> my3DGrid; NDGrid<char,4> my4DGrid; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //nDGrid.h #ifndef NDGRID_H #define NDGRID_H template <typename T,int N> class NDGrid { public: NDGrid( ); NDGrid( int inSize ); NDGrid( const NDGrid<T,N>& src ); ~NDGrid( ); NDGrid<T,N>& operator=( const NDGrid<T,N>& rhs ); NDGrid<T,N-1>& operator[ ]( int x ); const