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

    實際上有三種類型模板參數:類型模板參數、無類型模板參數和模板模板參數(以模板做爲模板的參數)。  
    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、指針和引用。  
    有時可能想要容許用戶指定一個特定值的元素來初始化空對象,可使用如下的方法:  
    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().  
相關文章
相關標籤/搜索