Mitgliedsvariablen mithilfe von Metaprogrammierung erkennen
Frage:
Wie können wir feststellen, ob eine Klasse enthält eine bestimmte Mitgliedsvariable, auch wenn ihr Name unbekannt ist oder in verschiedenen Versionen unterschiedliche Namen verwendet werden Klassen?
Lösung:
Ein Ansatz umfasst Metaprogrammierungstechniken und nutzt den Decltype-Operator und SFINAE (Substitution Failure Is Not An Error). Betrachten Sie den folgenden Code:
#include <type_traits> template <typename T, typename = int> struct HasX : std::false_type { }; template <typename T> struct HasX<T, decltype((void) T::x, 0)> : std::true_type { };
Erklärung:
Verwendung:
Um diese Technik zu verwenden, deklarieren Sie die Vorlage wie folgt:
template <typename T> bool Check_x(T p, typename HasX<T>::type b = 0) { return true; }
Diese Prüfung würde „true“ für Klassen mit einer x-Mitgliedsvariablen zurückgeben, wie zum Beispiel:
struct P1 { int x; };
und false für diejenigen ohne, wie zum Beispiel: als:
struct P2 { float X; };
Hinweis:
Diese Lösung vermeidet die Verwendung von C 11-Funktionen wie std::is_member_function_pointer, um die Kompatibilität mit älteren Compilern aufrechtzuerhalten.
Das obige ist der detaillierte Inhalt vonWie kann Metaprogrammierung das Vorhandensein von Mitgliedsvariablen in C-Klassen erkennen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!