標籤:pen c++ other oat 初始化 參數 idt div height
實際上有三種類型模板參數:類型模板參數、無類型模板參數和模板模板參數(以模板作為模板的參數)。 1、類型模板參數 類型模板參數是我們使用模板的主要目的。我們可以定義多個類型模板參數: template<typename T,typename Container> class Grid {...} 同樣,也可以為類型模板參數指定預設值: #include <iostream> using std::vector; template<typename T,typename Contianer=vector<T> > //注意空格 class Grid {...} 2、模板模板參數(template template parameter) 就是將一個模板作為另一個模板的參數。 正如上面的一個例子: Grid<int,vector<int> > myIntGrid; 注意其中int出現了兩次,必須指定Grid和vector的元素類型都是int。 如果寫成: Grid<int,vector> myIntGrid; 因為vector本身就是一個模板,而不是一個類型,所以這就是一個模板模板參數。指定模板模板參數有點像在常規的函數中指定函數指標參數。 函數指標類型包括傳回型別和函數的參數類型。在聲明模板模板參數的時候也要包括完整的模板聲明: 首先要知道作為參數的模板的原型,比如vector template<typename E,typename Allocator=allocator<E> > class vector {...}; 然後就可以定義: template<typename T,template<typename E,typename Allocator=allocator<E> >class Container=vector> class Grid { public: //Omitted for brevity Container<T>* mCells; }; 模板模板參數的一般文法: template<other params,...,template<TemplateTypeParams> class ParameterName,other params,...> 舉例一個應用,Grid的一個建構函式: template<typename T,template<typename E,typename Allocator=allocator<E> >class Container> Grid<T,Container>::Grid(int inWidth,int inHeight): mWidth(inWidth),mHeight(inHeight) { mCells=new Container<T> [mWidth]; //注意此處Container<T>說明,實際上還是說明 Grid<int,vector<int> > for(int i=0;i<mWidth;++i) mCells[i].resize(mHeight); } 使用的時候,與一般的沒有什麼區別: Grid<int,vector> myGrid; myGrid.getElement(2,3); 注意:不要拘泥於它的文法實現,只要記住可以使用模板作為模板的一個參數。 3、無類型模板參數 無類型模板參數不能是對象,甚至不能是double或者float。無型別參數僅限於int、enmu、指標和引用。 有時可能想要允許使用者指定一個特定值的元素來初始化Null 物件,可以使用以下的方法: template<typename T,const T EMPTY> class Grid { public: //Omitted for brevity Grid(const Grid<T,EMPTY>& src); Grid<T,EMPTY>& operator=( const Grid<T,EMPTY>& rhs); //... }; 我們可以這樣使用: Grid<int,10> myIntGrid; Grid<int,20> myIntGrid2; 初始值可以是任意的int數,也就是必須是int、enmu、指標和引用的一種。 4、指標和引用模板參數 指標和引用模板參數必須指向所有翻譯單元中都可用的全域變數。對於這些類型的變數,相應的技術術語就是帶有外部串連的資料。 使用extern聲明即可。 如: template<typename T ,const T& EMPTY> class Grid {...}; extern const int emptyInt=0; Grid<int,emptyInt> myIntGrid; 對於初始化我們還可以使用“零初始化”即 T().
C++模板參數類型(轉載)