Heim >Backend-Entwicklung >C++ >Wie erkennt man geerbte Mitgliedsfunktionen mithilfe von SFINAE in C?

Wie erkennt man geerbte Mitgliedsfunktionen mithilfe von SFINAE in C?

DDD
DDDOriginal
2024-11-06 00:36:02565Durchsuche

How to Detect Inherited Member Functions Using SFINAE in C  ?

Verwenden von SFINAE zum Überprüfen auf geerbte Mitgliedsfunktionen

SFINAE (Substitution Failure Is Not An Error) ist eine leistungsstarke Technik in C, die eine Auswertung von Ausdrücken zur Kompilierungszeit ermöglicht . Es kann verwendet werden, um das Vorhandensein von Mitgliedsfunktionen, einschließlich geerbter, zu erkennen.

Der folgende Code zeigt einen Ansatz zum Testen auf geerbte Mitgliedsfunktionen:

<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::*)(), &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>

Ausgabe:

true
true
false

Dieser Ansatz nutzt Klassenableitung und Vorlagenmetaprogrammierung, um zu bestimmen, ob ein bestimmter Typ eine Methode erbt. Die BaseMixin-Klasse definiert die gewünschte Methode und die Base-Klasse dient als Zwischentyp, der sowohl vom Zieltyp als auch von BaseMixin abgeleitet ist. Dies ermöglicht die Verwendung von SFINAE, um abzuleiten, ob die Methode auf dem Zieltyp vorhanden ist.

Die Klasse has_foo verwendet diese Schlussfolgerung dann, um eine Konstante zur Kompilierungszeit bereitzustellen, die angibt, ob die Methode vorhanden ist. Dies ermöglicht effizienten und erweiterbaren Code, der sein Verhalten basierend auf dem Vorhandensein oder Fehlen geerbter Mitgliedsfunktionen dynamisch anpassen kann.

Das obige ist der detaillierte Inhalt vonWie erkennt man geerbte Mitgliedsfunktionen mithilfe von SFINAE in C?. 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