2011-08-19 4 views
3

아래 코드에서 모든 전문화 (Widget<A<T> >Widget<B<T> >의 경우, T가 무엇이든간에)에서 common_fn()을 공유하는 방법은 무엇입니까?형질을 사용할 때 부분 템플릿 전문화에서 함수 정의 중복 방지

#include <cassert> 

struct Afoo {}; 
struct Bfoo {}; 

template<typename T> struct A { typedef Afoo Foo; }; 
template<typename T> struct B { typedef Bfoo Foo; }; 

template<typename Type> struct Widget 
{ 
    Widget() {} 
    typename Type::Foo common_fn() { return Type::Foo(); } 
    int uncommon_fn() { return 1; } 
}; 

template<typename T> struct Widget<A<T> > 
{ 
    Widget() {} 
    int uncommon_fn() { return 2; } 
}; 

int main() 
{ 
    Widget<A<char> > WidgetAChar; 
    assert(WidgetAChar.common_fn() == Afoo()); // Error 
    assert(WidgetAChar.uncommon_fn() == 2); 
} 

나는 그 본질은 무슨 생각에 질문을 단순화하기 위해 earlier을 시도했지만, 부분 특수화 및 특성의 맥락에서 그것을 물어 필요하다고 밝혀졌습니다.

답변

1

당신이 무엇을 노리고 있는지 명확하지 않습니다. 특히 uncommon_fn이 삽화만큼이나 간단하거나 더 많을 수 있습니다.

하지만 어쨌든 주어진 예제 코드의 경우 & hellip;

#include <cassert> 
#include <typeinfo> 

struct Afoo {}; 
struct Bfoo {}; 

template< class T > struct A { typedef Afoo Foo; }; 
template< class T > struct B { typedef Bfoo Foo; }; 

template< class Type > 
struct UncommonResult { enum { value = 1 }; }; 

template< class Type > 
struct UncommonResult< A<Type> > { enum { value = 2 }; }; 

template< class Type > 
struct Widget 
{ 
    Widget() {} 
    typename Type::Foo common_fn() { return Type::Foo(); } 
    int uncommon_fn() { return UncommonResult<Type>::value; } 
}; 

int main() 
{ 
    Widget<A<char> > WidgetAChar; 
    assert(typeid(WidgetAChar.common_fn()) == typeid(Afoo)); // OK 
    assert(WidgetAChar.uncommon_fn() == 2); 
} 

좀 더 일반적인 처리를 일반화하면 uncommon_fn은 어렵지 않아야합니다.

@iammilind가 이전 질문에 대해 보여준 상속 트릭을 고려해 볼 수도 있습니다. 실질적으로 더 간단 할 수도 있습니다. 그러나, 그것은 아마도 "잘못된"함수 구현에 액세스 할 가능성을 추가합니다.

건배 &hth.

+0

매우 흥미 롭습니다. 전체 또는 부분 전문화는 형식에 대한 switch 문을 발견하는 것이 코드에 상속 계층이 없다는 신호와 마찬가지로 더 나은 디자인이 누락 된 신호가 될 수 있습니다. 필자는 이러한 종류의 압축을 테스트했으며 코드 하위 집합의 모든 특수화를 폐기하는 데 성공했습니다. – Calaf

+0

미안하지만, 마지막 세 자리는 기억이 안납니다. 그래서 당신의 닉이 "정확하다"고 말할 수 없습니다 ;-) –

+0

그래! 다음 몇 가지 (메모리에서) : 5897932384626 ... – Calaf