2014-02-05 2 views
2

메타 기능을 기반으로 전문화해야하는 기본 템플릿이 있습니다. 일반적인 관용구 그러나부울 메타 기능을 기반으로 클래스 템플릿을 특수화하는 방법은 무엇입니까?

template<class T,class E = void> 
struct foo { }; 
template<class T> 
struct foo<T,std::enable_if_t<is_xxx<T>{}> > {}; 

처럼, 나는 기본 템플릿 (여분의 SFINAE 자리없이 즉)

template<class T> 
struct foo { }; 

로 기록되는 상황을 가지고 있고 그것을 변경할 수 없습니다하고있다. 특성을 기반으로 특수화하는 가장 좋은 방법은 무엇입니까 (반환 유형 또는 추가 인수를 기반으로하는 함수 템플릿의 경우 대부분 할 수 있습니다)?

template<class T, class E = void> 
struct foo_base { }; 

template<class T> 
struct foo : foo_base<T, std::enable_if_t<is_xxx<T>{}>> { }; 

그런 다음 foo_basefoo의 회원을 이동 :

+0

왜 수정할 수 없는지 언급하면 ​​해결책이 될 수 있습니다. – Yakk

+0

기본 템플릿이 표준이 아닌 제 제어하에 있습니다. 'foo ','foo '등과 같은 매칭을 기반으로하는 경우, 여분의 E = void 일 필요는 없습니다. – abir

+0

어떻게 통제 할 수 있습니까? 파일이 하드 드라이브에 있습니다. 그렇지 않습니까? 나는 진지해. 당신이 그것을 바꾸지 못하게하는 것은 무엇일까? 당신이 접근 할 수없는 다른 바이너리를 바꾸기에는 너무 많은 코드의 다른 특수화? 업데이트 후 재 패치해야합니까? 회사 정책? 많은 이유가 있으며 중요한 요소 일 수 있습니다. – Yakk

답변

1

당신은 기본 클래스를 추가 할 수 있습니다.

+0

OP 질문부터, 나는 그가'foo' 전체를 변경할 수 없다고 생각하는 것이 안전하다고 생각합니다. (타사 라이브러리에서 어쩌면 유형?) –

+1

그래서 그는 그것을 전문적으로 할 수있다'템플릿 구조체 foo는 > : {} {} foo_base은 >>,' – Jarod42

+0

만 기본 템플릿은 할 수 없습니다 변경된 전문화는 물론 내 손안에 있습니다. 그래서 이것은 기본 템플릿을 변경해야하는 예제 에서처럼 가능한 해결책은 아닙니다. – abir

관련 문제