SFINAE에 문제가 있습니다. 유형에 멤버 함수가 있는지 여부를 결정할 수 있어야합니다. operator => 반환 유형에 관계없이 정의됩니다. 예제는 다음과 같습니다.SFINAE - 템플릿 형식에 '변수'반환 형식의 멤버 함수가 있는지 확인하려고 시도했습니다.
이 클래스는 테스터에 있습니다. X *의 리턴 유형으로 연산자 ->()를 정의합니다. 따라서 나는 어디에서나 'X'가 하드 코드하는 것을 모른다.
template <class X>
class PointerX
{
...
X* operator->() const;
...
}
이 클래스는 T에서 전달 된 연산자 operator-> defined가 있는지 확인하려고 시도합니다. 에 관계없이 연산자 -> 반환 유형입니다.
template<typename T>
struct HasOperatorMemberAccessor
{
template <typename R, typename C> static R GetReturnType(R (C::*)()const);
template<typename U, typename R, R(U::*)()const> struct SFINAE{};
template<typename U> static char Test(SFINAE<U, decltype(GetReturnType(&U::operator->)), &U::operator-> >*);
template<typename U> static uint Test(...);
static const bool value = sizeof(Test<T>(0)) == sizeof(char);
};
이 클래스는 operator-> return 유형이 'Object'여야한다는 점을 제외하고는 완전히 똑같습니다.
template<typename T>
struct HasOperatorMemberAccessorOBJECT
{
template <typename R, typename C> static R GetReturnType(R (C::*)()const);
template<typename U, typename R, R(U::*)()const> struct SFINAE{};
template<typename U> static char Test(SFINAE<U, Object*, &U::operator-> >*); // only change is we hardcoded Object as return type.
template<typename U> static uint Test(...);
static const bool value = sizeof(Test<T>(0)) == sizeof(char);
};
결과 :
void main()
{
HasOperatorMemberAccessor<PointerX<Object>>::Test<PointerX<Object>>(0); // fails ::value is false; Test => Test(...)
HasOperatorMemberAccessorOBJECT<PointerX<Object>>::Test<PointerX<Object>>(0); // works! ::value is true; Test => Test(SFINAE<>*)
}
HasOperatorMemberAccessor는 PointX의 멤버 함수 "->() const를 개체 연산자"를 찾을 수 없습니다. 그래서 Test의 일반 버전 Test (...)를 사용합니다.
그러나 HasOperatorMemberAccessorOBJECT는 PointX의 "Object operator -> (const)"를 찾을 수있었습니다. 따라서 Test Special Version Test (SFINAE *)를 사용합니다.
둘 다 "Object operator -> (const)"메서드를 찾을 수 있어야합니다. 따라서 둘 다 Test의 Special version Test (SFINAE *)를 사용해야합니다. 따라서 HasOperatorMemberAccessor> :: value는 둘 다 true 여야합니다. HasOperatorMemberAccessor과 HasOperatorMemberAccessorOBJECT 사이의 유일한 차이는 HasOperatorMemberAccessorOBJECT 객체에 하드 코딩 유형 이름의 R을 가지고 있다는 것입니다
,
그래서이 문제는 "decltype (GetReturnType (& U :: 운용자>))"반환하지 않습니다 객체입니다 바르게. 리턴 타입을 발견하기위한 여러 가지 허가를 시도했다. 그들은 다음과 같이 구성됩니다 :
decltype(GetReturnType(&U::operator->))
typename decltype(GetReturnType(&U::operator->))
decltype(((U*)nullptr)->operator->())
typename decltype(((U*)nullptr)->operator->())
아무 이유없이 작동합니까? MSVC++ 10.0을 사용하고 있습니다.
눈에 띄는 것은 'PointerX :: operator->'는'bool *'이 아니라'bool *'을 반환한다는 것입니다. –
PointerX의 X 유형은 HasOperatorMemberAccessor와 관련이 없습니다. 예제에 많은 외부 객체를 추가하지 않음으로써 내 문제를 일반화하려고했습니다. 너무 혼란 스럽다면, 나는 bool을 문자열로 변경할 것입니다. –
다시 시도해주세요.'PointerX