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
Freigeben: 2024-12-03 14:35:14
Original
210 Leute haben es durchsucht

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; };
Nach dem Login kopieren

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; };
Nach dem Login kopieren

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;
};
Nach dem Login kopieren

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; }
};
Nach dem Login kopieren

Ableitungen können behandelt werden mit:

class WITH_SELF_DERIVED(Bar, Foo) {
  /* ... */
};
Nach dem Login kopieren

Mehrfachvererbung und variadische Makros ermöglichen eine einfache Integration in komplexe Klassenhierarchien:

class WITH_SELF(Foo2) { /* ... */ };

class WITH_SELF_DERIVED(Bar2, Foo, Foo2) {
  /* ... */
};
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage