2012-06-28 6 views
0

에 따라 생성자를 사용/추가는 가능 다음 시나리오에서 템플릿의 특정 전문화를위한 전용 생성자를 정의하는 것입니다 :C++ 템플릿은 템플릿 인수

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