2013-02-12 4 views
6

조건 (SFINAE) 재정의 :나는이 작업을 수행하기 위해 노력하고있어

struct A 
{ 
    virtual int f() const { return 0; } 
}; 

template <typename T> 
struct B : A 
{ 
    template <typename U = T, 
    typename std::enable_if<...some condition involving U...>::type> 
    int f() const { return 1; } 
}; 

주의 할, 내가 상속 할 수 없습니다 클래스 템플릿 (정적 재정의를 사용). 이 종류의 구조가 허용되며 템플릿 멤버 B :: f()가 멤버 A :: f()를 재정의 할 수 있습니까?

답변

6

이 시도 : 우리는 조건이 거짓 하나의 조건이 true 일하는 B<T>의 두 가지 버전합니다 (enable_if 한), (기본값을)이

template <typename T, typename=void> 
struct B : A 
{ 
    ... 
}; 

temlate <typename T> 
struct B<T, typename std::enable_if<...some condition...>::type>: 
    A 
{ 
    virtual int f() const override { return 1; } 
}; 

. 당신이 당신의 기본 B 구현을 재사용 할 수 있기를 원한다면, 당신도이 작업을 수행 할 수

: 우리가 "true"로 경우에 "false"를 케이스에서 상속

template <typename T, typename=void> 
struct B : A 
{ 
    ... 
}; 

template <typename T> 
struct B<T, typename std::enable_if<...some condition...>::type>: 
    B<T, bool> 
{ 
    virtual int f() const override { return 1; } 
}; 

. 하지만 그것은 나에게 조금 더러웠다. 나는 오히려 해킹보다는 일반적인 구현을 제 3의 자리 (B_impl)에 두려고했다. (이 경우 두 번째 인수는 이고 첫 번째 경우는 B 임).

+0

놀라운 아이디어는 완벽하게 작동합니다. – user1095108

관련 문제