당신은 (있는 다음을 통해 찾고있는 효과를 얻을 수 있습니다 이는) BTW, 0 1 출력합니다 :
#include <type_traits>
#include <iostream>
namespace detail
{
struct SZugBase{};
}
template <typename tTYPE>
struct SFoo
{
struct SZug : public detail::SZugBase {};
};
template<typename tType, bool IsFoo>
struct SBarBase
{
int value = 0;
};
template<typename tType>
struct SBarBase<tType, true>
{
int value = 1;
};
template <typename tTYPE>
struct SBar : public SBarBase<tTYPE, std::is_convertible<tTYPE, detail::SZugBase>::value>
{ /* stuff */ };
int main()
{
SBar<int> b0;
SBar<SFoo<int>::SZug> b1;
std::cout << b0.value << " " << b1.value << std::endl;
}
설명
는 첫째, 우리는 SZug
정규-B 등급을 부여 ASE :
namespace detail
{
struct SZugBase{};
}
template <typename tTYPE>
struct SFoo
{
struct SZug : public detail::SZugBase {};
};
참고 다음
SZugBase
은 아무것도에 의해 파라미터, 그래서 SFoo
SZugBase
의 매개 변수에 독립적으로 그것을 참조하기 쉬운에되지
detail
네임 스페이스이므로 일반적인 C++ 규칙에 따라 클라이언트에 코드를 무시하도록 지시하고 있습니다.
이제 우리는 뭔가 SZug
의 비 템플릿 기반에 전환 여부에 전문 SBar
두 개의 기본 클래스, 제공 : 마지막으로
template<typename tType, bool IsFoo>
struct SBarBase
{
int value = 0;
};
template<typename tType>
struct SBarBase<tType, true>
{
int value = 1;
};
을, 우리는 단지 SBar
이 기지의 서브 클래스를 만들 필요가 (전문화에 따라) : 당신이 SBar
을 전문으로하지 않는
template <typename tTYPE>
struct SBar : public SBarBase<tTYPE, std::is_convertible<tTYPE, detail::SZugBase>::value>
{ /* stuff */ };
주를 그녀의 e, 당신은 오히려 기본 클래스를 전문화합니다. 이것은 효과적으로 동일한 효과를 제공합니다.
이후에 무엇을 할 계획입니까? "전문화"가 무엇을 기대하는지는 분명하지 않습니다. 비 특화되고 전문화 된'SBar' 변수를 선언하는 방법을 보여줄 수 있습니까? – Holt
저는 실제로 이것들을 특성 유형으로 사용하고 있습니다. 따라서 실제로 인스턴스화 된 적이 없습니다. Bar는 단순히 (언급되지 않은) 다른 클래스를위한 constexpr 멤버 포인터를 제공한다. 일반적으로 멤버 포인터는 명시 적으로 지정해야하지만 'SZug'전문화의 경우이를 결정할 수 있습니다. - 궁극적으로 이것은 1 대 N 제네릭 컨테이너에서 N 대 N 일반 임베디드 컨테이너 생성과 관련됩니다. 멤버 포인터는 사용자의 컨테이너 또는 노드 정보 "임베디드"(즉 멤버 변수)를 가리 킵니다. 유형). – xaxazak
나는 그것을 감지하기 위해'SZug'를 약간 수정할 수있다. SFINAE를 사용하여 원하는 것을 쉽게 수행 할 수있다. (내 대답 참조). 그렇게 할 수 없다면,'ttyPE '이'SFoo :: SZug' 클래스라는 것을 알아낼 방법이 있는지 확신하지 못합니다. –
Holt