Heim  >  Artikel  >  Backend-Entwicklung  >  Wie funktioniert diese C-is_base_of-Implementierung mit CRTP?

Wie funktioniert diese C-is_base_of-Implementierung mit CRTP?

DDD
DDDOriginal
2024-11-22 05:40:15148Durchsuche

How Does This C   `is_base_of` Implementation Using CRTP Work?

Wie funktioniert diese Implementierung des Merkmals is_base_of?

Der von Ihnen bereitgestellte Codeausschnitt implementiert das Merkmal is_base_of in C, das prüft, ob eine Klasse von einer anderen erbt. Es verwendet eine Technik namens „Curiously Recurring Template Pattern“ (CRTP).

Wie es funktioniert

Host ist eine Vorlagenklasse, die die abgeleitete Klasse umschließt und eine Möglichkeit bietet, auf ihren Operator B* zuzugreifen. Funktion. Wenn wir prüfen möchten, ob B die Basisklasse von D ist, rufen wir is_base_of::value auf.

  1. Die Prüffunktion überlädt zwei Funktionen:

    • statische Ja-Prüfung(D*, T)
    • statische Nein-Prüfung(B*, int)
  2. Host kann dank benutzerdefinierter Konvertierungssequenzen sowohl in D* als auch B* konvertiert werden.
  3. Wenn B die Basis von D ist, wird die erste Prüffunktion mit Host aufgerufen. in D* und ein beliebiges T konvertiert. Die Prüffunktion gibt ein Ja zurück, wenn die Konvertierung erfolgreich ist (d. h. D erbt von B).
  4. Wenn B nicht die Basis von D ist, wird die zweite Prüffunktion aufgerufen mit Host in B* konvertiert und der Wert von int angegeben. Die Prüffunktion gibt ein „Nein“ zurück, wenn die Konvertierung in B* erfolgreich ist (d. h. B und D stehen nicht in Beziehung).
  5. is_base_of::value wird auf „true“ gesetzt, wenn die Prüffunktion „a“ zurückgibt ja und andernfalls falsch.

Wichtigkeit des const-Schlüsselworts im Operator B*

Der Operator B* muss sein const, da sonst die Auswahl der aufzurufenden Prüffunktion unklar wäre. Mit dem Schlüsselwort const weiß der Compiler, dass er die Prüffunktion verwenden muss, die B* const& akzeptiert.

Warum ist die erste Prüffunktion besser?

Die erste Prüffunktion ist besser, weil sie einen Benutzer verwendet -definierte Konvertierungssequenz, die von D* nach B* konvertiert. Dies ist spezifischer als die zweite Prüffunktion, die eine benutzerdefinierte Konvertierungssequenz verwendet, die von B* in int konvertiert.

Das obige ist der detaillierte Inhalt vonWie funktioniert diese C-is_base_of-Implementierung mit CRTP?. 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