C++模板參數類型(轉載)

來源:互聯網
上載者:User

標籤: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++模板參數類型(轉載)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.