2012-06-28 179 views
0

添加/啓用的構造是否有可能在以下情況下定義專用構造函數模板的某些專業:C++模板基於模板參數

template<typename T, size_t D> 
class vector { 
    T values[D]; 
public: 
    vector(); 
}; 

構造函數我要添加依賴於d-參數:

template<typename T> 
vector<T, 2>::vector(T t1, T t2) { ... } 

template<typename T> 
vector<T, 3>::vector(T t1, T t2, T t3) { ... } 

template<typename T> 
vector<T, 4>::vector(T t1, T t2, T t3, T t4) { ... } 

回答

7
template<bool B> 
using EnableIfB = typename std::enable_if<B, int>::type; 

template<typename T, size_t D> 
class vector { 
    T values[D]; 
public: 
    template<size_t D1 = D, EnableIfB<D1 == 2> = 0> 
    vector(T t1, T t2) { ... } 

    template<size_t D1 = D, EnableIfB<D1 == 3> = 0> 
    vector(T t1, T t2, T t3) { ... } 

    template<size_t D1 = D, EnableIfB<D1 == 4> = 0> 
    vector(T t1, T t2, T t3, T t4) { ... } 
}; 

希望這有助於。

+0

+1中工作,因爲我不知道使用語句可以模板化,非常方便! –

+0

謝謝,我試過了,但我的編譯器抱怨說我無法在構造函數模板上提供默認參數?! – MFH

+0

@MFH你的編譯器已經過時了。那麼你不能使用我的解決方案。 –

0

考慮每個構造函數定義的所有構造函數爲主要模板vector<T, D>,然後static_assert,以確保元數匹配。例如:

vector(T t0, T t1) 
{ 
    static_assert(D == 2, "Eeeeeeeekkkkk! Wrong constructor!"); 
} 
+0

雖然我更喜歡其他版本,但這個版本在VC10 ... – MFH