SFINAE를 여러 번 성공적으로 사용했습니다. 클래스가 함수를 제공하는지 여부를 감지하는 것은 문제가되지 않습니다. 현재의 문제는 his problem의 반대편 인 것 같습니다! 대신이 파생 된 메서드를 검색하므로 클래스의 메서드 만 검색하는 것이 좋습니다. 이 방법이 템플릿이라는 사실과 관련이있는 것 같습니다.SFINAE를 사용하여 템플릿 클래스 멤버 함수를 검색 할 수 있습니까?
클래스 템플릿 방법을 감지 할 수 있습니까? 해를 끼치 지 않는 유형의 템플릿을 인스턴스화하려고 시도했지만 운이 없습니다.
struct A { template<class T> void Func(T) {}; };
struct B :A {};
template< class T >
struct CheckForFunc
{
typedef char(&YesType)[1];
typedef char(&NoType)[2];
template< class U, void (U::*)(int) > struct Sfinae;
template< class T2 > static YesType Test(Sfinae<T2,&T2::Func>*);
template< class T2 > static NoType Test(...);
static const bool value = sizeof(Test<T>(0))==sizeof(YesType);
};
int main(int argc, char* argv[])
{
// gives "1"
std::cout << "Value A=" << CheckForFunc<A>::value << std::endl;
// doesn't compile!
std::cout << "Value B=" << CheckForFunc<B>::value << std::endl;
return 0;
}
오류 메시지 :이 SFINAE은 그냥 유도로, 템플릿 방법과 매우 잘 작동
error: ‘&A::Func’ is not a valid template argument for type ‘void (B::*)(int)’ because it is of type ‘void (A::*)(int)’
주의! 나쁜 것은 그것이 잘못 발견하지 않는다는 것입니다. 컴파일이 실패합니다.
'샘플'유형 (여기에서는 int)을 사용하지 않고 SFINAE 테스트를 작성하는 방법은 무엇입니까?
편집 : 죄송합니다, C++ 03! 그리고 LLVM은 VS2008도 GCC와 QNX (내일은 봐야 할 버전)가 아니 었습니다.
편집 2 : Coliru에 대해 몰랐습니다! 매우 시원하고 여기는 error입니다!
그냥 사용할 이유 0 '시험 (보이드 (T2 : : *) (int) = nullptr)'sizeof (테스트())'? –
[귀하의 코드는 clang ++을 사용하여 컴파일됩니다.] (http://coliru.stacked-crooked.com/view?id=869eb009d893d56f344c9c7c09356b5d-e223fd4a885a77b520bbfe69dda8fb91). 나는 이상한 것을 발견한다! 나는 그것이 clang의 버그라고 생각합니다! – Nawaz
기본 인수를 사용하는 흥미로운 생각. nullptr C++ 11입니까? – Borph