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 (& chk(type_check<Sig, &V::foo>*))[1]; template <typename > static char (& 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::*)(), &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 중국어 웹사이트의 기타 관련 기사를 참조하세요!