Erkennen der Anwesenheit von Mitgliedsfunktionen mithilfe von Merkmalen vom Typ C 11
Frage:
Wie können wir Bestimmen Sie, ob eine Klasse eine Mitgliedsfunktion mit einer bestimmten Signatur besitzt, ohne dass die Klasse diese bereitstellen muss es?
Ausarbeitung des Dilemmas:
Das Problem entsteht, wenn wir benutzerdefinierte Operationen basierend auf dem Vorhandensein oder Fehlen einer bestimmten Mitgliedsfunktion in einer Klasse ausführen müssen. Im Gegensatz zu Fällen, in denen die Klasse die Funktion bereitstellen muss, suchen wir nach einer Methode, um ihre Existenz für die bedingte Verarbeitung zu erkennen. Die ideale Lösung vermeidet das Überschreiben globaler Funktionen, übermäßige Stapelaufrufe und aufdringliche Namespace-Deklarationen.
Vorlagenbasierte Lösung:
Unter Verwendung von C 11-Typmerkmalen können wir eine entwickeln Vorlagenfunktion, die die Existenz des Ziels überprüft Funktion:
template<typename C, typename Ret, typename... Args> struct has_serialize { // Assertion to prevent instantiation with non-function arguments static_assert( std::integral_constant<T, false>::value, "Second template parameter needs to be of function type." ); // Specialization to perform the check private: template<typename T> static constexpr auto check(T*) -> typename std::is_same< decltype( std::declval<T>().serialize( std::declval<Args>()... ) ), Ret // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >::type; // attempt to call it and see if the return type is correct template<typename> static constexpr std::false_type check(...); typedef decltype(check<C>(0)) type; public: static constexpr bool value = type::value; };
Verwendung:
Wir können jetzt die Vorlage has_serialize verwenden, um die Existenz einer Funktion innerhalb einer Klasse zu überprüfen:
struct X { int serialize(const std::string&) { return 42; } }; struct Y : X {}; std::cout << has_serialize<X, int(const std::string&)>::value; // prints 1
In Im obigen Beispiel wird has_serialize
Das obige ist der detaillierte Inhalt vonWie können Merkmale vom Typ C 11 das Vorhandensein einer Mitgliedsfunktion mit einer bestimmten Signatur erkennen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!