2011-08-08 7 views
16

동일한 클래스의 여러 버전을 사용할 수 있습니까? 템플릿 인수의 수만 다릅니다. 예를 들어템플릿 매개 변수 번호로 템플릿 클래스 오버로드

:

template<typename T> 
class Blah { 
public: 
    void operator()(T); 
}; 

template<typename T, typename T2> 
class Blah { 
public: 
    void operator()(T, T2); 
}; 

가변 인자를 취할 수 펑터 유형의 물건을 모델링하기 위해 노력하고있어 (기입 된 다른 템플릿의 수까지).

+0

당신이 typelists으로 뭔가를 할 수 있는지 궁금하네요. – john

+0

@john 좋은 생각 이었지만 MSVC++ 2010을 사용하고 있습니다. 믿을 수는 없습니다. –

+0

사실 boost :: tuple은 아마도 같은 아이디어의 더 접근하기 쉬운 버전 일 것입니다. 유형이 하나 인 일반 템플릿이 있고, 2, 3, 4 ... 유형의 튜플이있는 특수화 된 버전이 있어야합니다. – john

답변

22

가장 간단한 대답은 지원하려는 최대 개수로 하나의 템플릿 만 있고 첫 번째 유형을 제외하고 모두 기본 유형에 대해 void를 사용하는 것입니다. 템플릿은 하나 기본 정의를 가질 수

template<typename T1, typename T2=void> 
struct foo { 
    void operator()(T1, T2); 
}; 

template <typename T1> 
struct foo<T1, void> { 
    void operator()(T1); 
}; 

int main() { 
    foo<int> test1; 
    foo<int,int> test2; 
    test1(0); 
    test2(1,1); 
} 
+1

'operator() (T, T2, T3, T4)'의 정의가 'void'일 경우 제대로 작동하지 않을 것이라고 생각합니다. –

+0

@Ben 당신 말이 맞아요, 그렇지 않아요. 벌써 해봤어요. –

+2

@ben - 그런 식으로 작동하지 않습니다. 따라서 부분적으로 특수화 된 템플릿을 사용하면 템플릿 템플릿의 인수에 "오버로드"가 발생합니다. – Flexo

14

: 그럼 당신은 필요에 따라 부분 특수화를 사용할 수 있습니다. 당신은 가변 인자를 필요 @awoodland에서 알 수 있듯이 당신은 "널 유형"구조물을 사용하지 않고, 당신이 C + +0 컴파일러가 있다면, 당신은 가변 인자 템플릿을 사용할 수있는 경우 :

template <typename ...Dummy> struct foo; // base case, never instantiated! 

template <typename T> struct foo<T> { /*...*/ }; // partial spec. for one parameter 
template <typename T, typename U> struct foo<T, U> { /*...*/ }; // ditto for two 
0

이 테스트되지 않은 코드입니다, 내가 부스트 편리한 버전을 가지고 있지만, 여기 어쨌든 이동하지 않는

#include "boost/tuple.h" 

template <class T> 
class Blah; 

template <class T> 
class Blah< boost::tuple<T> > 
{ 
    void operator()(T arg); 
}; 

template <class T, class U> 
class Blah< boost::tuple<T, U> > 
{ 
    void operator()(T arg1, U arg2); 
}; 

등 등

관련 문제