Heim >Backend-Entwicklung >C++ >Wie kann ich in C-Klassen Selbstreferenzierung erreichen, ohne den Klassennamen zu wiederholen?

Wie kann ich in C-Klassen Selbstreferenzierung erreichen, ohne den Klassennamen zu wiederholen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-03 14:35:14217Durchsuche

How Can I Achieve Self-Referencing in C   Classes Without Repeating the Class Name?

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!

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