Heim >Backend-Entwicklung >C++ >Wie erkennt man geerbte Mitgliedsfunktionen mithilfe von SFINAE in C?
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!