2009-05-26 71 views
2

如何製作採用2個參數而不是普通1的模板專業化? 我是建設一個指針類,現在我想過延伸到製造陣列但如果我嘗試這樣的事:具有2個或1個模板參數的同一類

template<class T,int s> class pointer{}; 
template<class T> class pointer{}; 

class mama{}; 
int main(){ 
    pointer<mama> m; 
} 

它給了我一個錯誤。模板...用1個參數重新聲明。

我需要它專門,因爲pointer<mama,10>有大小()和運算符[],而pointer<mama>沒有,它有operator->和*。

回答

8

你可以做的陣列情況下,一般的模板:

template <class TElem, int size = 0> 
class pointer 
{ 
    // stuff to represent an array pointer 
}; 

然後,局部特殊化:

template <class TElem> 
class pointer<TElem, 0> 
{ 
    // completely different stuff for a non-array pointer 
}; 

通過定義的情況下的特殊版本,其中大小= 0,你實際上可以給出一個完全不同的實現,但具有相同的名稱。

然而,它可能會更清楚,只是給它一個不同的名稱。

2

你可以有第二個參數的默認值,或許是這樣的:

template <class T, int N=0> 
class moo { 
     T *foo; 
public: 
     moo() { 
       if (N > 0) { 
         foo = new T[N]; 
       } 
       else 
       { 
         foo = new T; 
       } 
     } 
}; 
+0

if else is醜陋... – 2017-04-13 20:01:19

3

您的代碼類模板重新聲明,這將導致一個編譯時錯誤。您可以擁有默認的模板參數和模板模板參數。

template<class T,int s=10> class pointer{}; 

class mama{}; 
int main(){ 
    pointer<mama> m; 
} 

我需要它,因爲專業指針有大小()和operator [],而指針不,它具有操作符 - >和*。

看起來您需要爲您的班級設計不同的設計。我不確定是否需要模板專業化。從你的問題看,你真的應該考慮基於特質的專業化。

相關問題