Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erkennt man geerbte Mitgliedsfunktionen mithilfe von SFINAE?

Wie erkennt man geerbte Mitgliedsfunktionen mithilfe von SFINAE?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-05 13:52:02456Durchsuche

How to Detect Inherited Member Functions Using SFINAE?

SFINAE zur Erkennung geerbter Mitgliedsfunktionen

Inhärente Mitgliedsfunktionen können mithilfe von SFINAE-Techniken (Substitution Failure Is Not An Error) erkannt werden. Standard-SFINAE-Implementierungen können jedoch unzureichend sein. In diesem Artikel wird eine Problemumgehungslösung zum Erkennen geerbter Mitgliedsfunktionen untersucht.

Beachten Sie den folgenden Code:

<code class="cpp">#include <iostream>

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
}</code>

Dieser Code verwendet SFINAE, um Mitgliedsfunktionen zu erkennen. Allerdings werden geerbte Mitgliedsfunktionen in B nicht erkannt.

Um dieses Problem zu beheben, kann die folgende Codebasis verwendet werden:

<code class="cpp">#include <iostream>

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))); 
}; 

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>

Diese Version nutzt Klassenvererbung und definiert eine Hilfsklasse zur Unterstützung im SFINAE-Check. Die Ergebnisausgabe zeigt die erfolgreiche Erkennung geerbter Mitgliedsfunktionen.

Das obige ist der detaillierte Inhalt vonWie erkennt man geerbte Mitgliedsfunktionen mithilfe von SFINAE?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn