question에 대한 대답을 읽은 후 SFINAE를 사용하여 클래스에 특정 구성원 기능이 있는지 여부에 따라 두 가지 기능 중 하나를 선택할 수 있음을 알게되었습니다. 여러 작업을 수행 할 수 SFINAE을 확장 할 수 있다면 궁금여러 SFINAE 규칙
template<typename T>
void Func(T &arg, int_to_type<true>); //T has X()
template<typename T>
void Func(T &arg, int_to_type<false>); //T does not have X()
된다
template<typename T>
void Func(T& arg)
{
if(HAS_MEMBER_FUNCTION_X(T))
arg.X();
else
//Do something else because T doesn't have X()
}
: 그것은 if 문에서 각 지점이 오버로드 된 함수로 분할 그냥 다음에 해당하는의 규칙. 다음과 같은 내용이 될 수 있습니다.
template<typename T>
void Func(T& arg)
{
if(HAS_MEMBER_FUNCTION_X(T)) //See if T has a member function X
arg.X();
else if(POINTER_DERIVED_FROM_CLASS_A(T)) //See if T is a pointer to a class derived from class A
arg->A_Function();
else if(DERIVED_FROM_CLASS_B(T)) //See if T derives from class B
arg.B_Function();
else if(IS_TEMPLATE_CLASS_C(T)) //See if T is class C<U> where U could be anything
arg.C_Function();
else if(IS_POD(T)) //See if T is a POD type
//Do something with a POD type
else
//Do something else because none of the above rules apply
}
이렇게 할 수 있나요?
감사합니다.
감사합니다 (호출 할 때 분명히, 당신은 옵션은 상호 배타적이지로 조심해야한다). 나는 IS_TEMPLATE_CLASS_C 예제를 제외하고는 enable_if를 사용하여 모든 것을 작동시킬 수 있었다. is_base_of와 비슷한 것을 쓸 수있는 방법이 있습니까? T는 등 C, C ,, 그리고 다른 모든 –
Fred
@Fred에 대한 잘못된 경우 즉 < C, T > :: 값 is_template_of 사실이 될 것이다 : 문제는'C'와'C '입니다 관련이없는 유형이다. 저의 첫 번째 생각은 클래스 템플릿'C' (IsInstantiatedTemplateC')에 typedef 또는 정수형 멤버를 추가하고 그 존재를 테스트하는 것입니다. 또는 빈 클래스'BaseC'에서 공개적으로 클래스 템플릿'C'를 파생시키고 해당 유형의 상속을 테스트 할 수 있습니다. 유형이 일부 템플릿의 인스턴스 생성인지 여부를 알고 싶다면 다소 이상한 일입니다. 일반적으로 타입이 알려진 인터페이스를 구현하는 한 상관하지 않습니다. –