2013-03-01 3 views
3

라이브러리 및 해당 프로젝트에 종속 된 여러 프로젝트가 있다고 가정합니다. 라이브러리 헤더에는 이미 일부 부분 클래스 특수화가 있습니다. 각 종속 프로젝트가 자체적 인 부분 전문화로 재정의 할 수있게하고 싶습니다. 성능상의 이유로이 모든 것을 정적으로 달성해야합니다. 다음은 간단한 코드입니다.종속 프로젝트의 부분 C++ 템플릿 특수화

도서관 코드 :

template <class A, class B, class Enable=void> 
struct Widget; 

struct Foo 
{ 
}; 

template <class B> 
struct Widget<Foo, B> 
{ 
}; 

사용자 코드 :

template <class B> 
struct DoSpecialize; 

template <class B> 
struct Widget<Foo, B, enable_if< DoSpecialize<B> >::type 
{ 
}; 

문제는 여기에 우리가 같은 전문화의 여러 정의로 끝날 것입니다. 어딘가에 disable_if<>이 필요하다고 생각합니다. 어떻게 이것을 피할 수 있을까요?

+0

마지막 전문화에서 'B'는 실제로 특정 유형입니까? – aschepler

+0

아니요, 템플릿 매개 변수입니다 ... 고정 질문 – paperjam

답변

1

레이어를 분리하여 해결할 것을 제안합니다. 라이브러리는 자체 전문화가되어 있으며 필요에 따라 사용자가이를 전문적으로 덮어 쓸 수 있습니다. 허용되는 경우 라이브러리 코드는 다음과 같습니다.

namespace impl 
{ 
    template <class A, class B, class Enable=void> 
    struct Widget; 
} 

template <class A, class B, class Enable=void> 
struct Widget : impl::Widget< A, B > {}; 

struct Foo 
{ 
}; 

namespace impl 
{ 
    template <class B> 
    struct Widget<Foo, B> 
    { 
    }; 
} 

이며 사용자 코드는 그대로 유지됩니다.