> 백엔드 개발 > C++ > SFINAE가 상속된 멤버 함수를 감지하지 못하는 이유는 무엇입니까?

SFINAE가 상속된 멤버 함수를 감지하지 못하는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-11-06 15:34:02
원래의
695명이 탐색했습니다.

Why Does SFINAE Fail to Detect Inherited Member Functions?

SFINAE로 멤버 함수 감지 상속

SFINAE(Substitution Failure Is Not an Error)를 사용하면 지정된 클래스 내에서 멤버 함수를 감지할 수 있습니다. . 그러나 상속된 멤버 함수에 적용하면 SFINAE에 제한이 발생하여 잘못된 감지가 발생합니다.

이 문제를 설명하려면 다음 코드를 고려하세요.

<code class="cpp">// Does not correctly detect inherited member functions
template<typename T, typename Sig>                                 
struct has_foo {                     
    template <typename U, U> struct type_check;
    template <typename V> static char (&amp; chk(type_check<Sig, &amp;V::foo>*))[1];
    template <typename  > static char (&amp; chk(...))[2]; 
    static bool const value = (sizeof(chk<T>(0)) == 1);
};

struct A {
    void foo();
};

struct B : A {};

int main()
{
    using namespace std;
    cout << boolalpha << has_foo<A, void (A::*)()>::value << endl; // true
    cout << boolalpha << has_foo<B, void (B::*)()>::value << endl; // false
}
로그인 후 복사

이 예에서 has_foo는 실패합니다. A에서 B의 상속된 foo() 멤버를 감지합니다.

이러한 한계를 극복하려면 보다 세련된 SFINAE 기술이 필요합니다. 다음 솔루션을 고려하십시오.

<code class="cpp">template <typename Type> 
class has_foo
{ 
   class yes { char m;}; 
   class no { yes m[2];}; 
   struct BaseMixin 
   { 
     void foo(){} 
   }; 
   struct Base : public Type, public BaseMixin {}; 
   template <typename T, T t>  class Helper{}; 
   template <typename U> 
   static no deduce(U*, Helper<void (BaseMixin::*)(), &amp;U::foo>* = 0); 
   static yes deduce(...); 
public: 
   static const bool result = sizeof(yes) == sizeof(deduce((Base*)(0))); 
}; 

// Usage
struct A {
    void foo();
};

struct B : A {};

struct C {};

int main()
{
    using namespace std;
    cout << boolalpha << has_foo<A>::result << endl;
    cout << boolalpha << has_foo<B>::result << endl;
    cout << boolalpha << has_foo<C>::result;
}</code>
로그인 후 복사

결과:

true
true
false
로그인 후 복사

이 솔루션은 foo() 멤버 함수를 제공하는 기본 믹스인 클래스인 BaseMixin을 도입합니다. 상속된 멤버 함수는 믹스인 클래스에 foo()가 있는지 확인하여 감지합니다. 이 기술을 사용하면 여러 수준으로 상속된 멤버 함수를 포함하여 상속된 멤버 함수를 정확하게 감지할 수 있습니다.

위 내용은 SFINAE가 상속된 멤버 함수를 감지하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿