Heim >Backend-Entwicklung >C++ >Wie kann ich in C-Klassen Selbstreferenzierung erreichen, ohne den Klassennamen zu wiederholen?
Selbstreferenzierende Klassen in C ohne Wiederholung
C bietet kein Äquivalent zum PHP-Schlüsselwort self, das den Typ der Einschließung darstellt Klasse. Um es für eine bestimmte Klasse zu emulieren, kann man Folgendes definieren:
struct Foo { typedef Foo self; };
Dies erfordert jedoch die Wiederholung des Klassennamens, um Platz für stille Fehler zu lassen. Gibt es eine „autonome“ Möglichkeit, dies mithilfe von decltype und Freunden zu erreichen?
Die folgende Syntax schlägt aufgrund der ungültigen Verwendung von this auf der obersten Ebene fehl:
struct Foo { typedef decltype(*this) self; };
Eine Lösung besteht in der Einführung von a Template-Klasse Self wie folgt:
template <typename... Ts> class Self; template <typename X, typename... Ts> class Self<X, Ts...> : public Ts... { typedef X self; };
Makros können dann verwendet werden, um die Klasse zu vereinfachen Definitionen:
#define WITH_SELF(X) X : public Self<X> #define WITH_SELF_DERIVED(X, ...) X : public Self<X, __VA_ARGS__> class WITH_SELF(Foo) { void test() { self foo; } };
Ableitungen können behandelt werden mit:
class WITH_SELF_DERIVED(Bar, Foo) { /* ... */ };
Mehrfachvererbung und variadische Makros ermöglichen eine einfache Integration in komplexe Klassenhierarchien:
class WITH_SELF(Foo2) { /* ... */ }; class WITH_SELF_DERIVED(Bar2, Foo, Foo2) { /* ... */ };
Diese Technik wurde sowohl mit GCC 4.8 als auch mit Clang 3.4 getestet und verifiziert.
Das obige ist der detaillierte Inhalt vonWie kann ich in C-Klassen Selbstreferenzierung erreichen, ohne den Klassennamen zu wiederholen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!