C++-Standardbibliothek<typeinfo>

In C++,<typeinfo>Es ist Teil der Standardbibliothek und bietet Funktionen zur Laufzeit-Typidentifikation (RTTI). RTTI ermöglicht es Programmen, den Typ eines Objekts zur Laufzeit zu bestimmen. Dies geschieht durch die Verwendung vontypeidoperator undtype_infoimplementiert durch die Klasse.

type_infoDie Klasse ist eine abstrakte Basisklasse, die eine Schnittstelle für Typinformationen bereitstellt. Jeder Typ hat ein zugehörigestype_infoObjekt, auf dastypeidmit operator zugegriffen werden kann.

Syntax

<typeinfo>Zugehörige Hauptsyntax:

  • typeidOperator: wird verwendet, um die Typinformationen eines Objekts abzurufen.
  • type_infoclass: eine Klasse, die Typinformationen enthält.

Typinformationsklassetype_info

typeinfoDie Header-Datei bietet Laufzeitunterstützung für Typinformationen. Sie enthält hauptsächlich zwei Kernkomponenten:std::type_infoKlasse undtypeidOperatoren.typeinfoSie ermöglicht es dem Programm, die Typinformationen des Objekts zur Laufzeit abzurufen, was in polymorphem und typsicherem Code sehr nützlich ist. Im Folgenden folgt eine Einführung intypeinfoDetaillierte Einführung:

std::type_info-Klasse

std::type_infoDie Klasse isttypeinfoDie Kernklasse der Header-Datei, die verwendet wird, um einen Typ zu beschreiben. Sie stellt mehrere Mitgliedsfunktionen zum Abfragen von Typinformationen bereit. Häufig verwendete Mitgliedsfunktionen sind wie folgt:

  • const char* name() const noexcept;Gibt einen C-String-Zeiger auf den Typnamen zurück. Beachten Sie, dass dieser Name nicht unbedingt ein für Menschen lesbarer Typname ist; sein Format wird durch die Compiler-Implementierung bestimmt.

  • bool before(const std::type_info& rhs) const noexcept;vergleicht zweitype_infoObjekte in einer bestimmten Reihenfolge und gibt zurück, ob das aktuelle Objekt vorrhsbefore.

  • bool operator==(const std::type_info& rhs) const noexcept;vergleicht zweitype_infoob die Objekte denselben Typ darstellen.

  • bool operator!=(const std::type_info& rhs) const noexcept;vergleicht zweitype_infoob die Objekte unterschiedliche Typen darstellen.

typeid-Operator

typeidDer Operator wird verwendet, um Typinformationen zur Laufzeit abzurufen.typeidEr kann auf Objekte (Zeiger oder Referenzen mit polymorphischem Verhalten) oder Typen (ohne ein Objekt zu instanziieren) angewendet werden.

  • typeid(object): gibt einstd::type_infoObjekt zurück, dasobjectden dynamischen Typ darstellt. WennobjectWenn es ein polymorpher Typ ist (d. h. virtuelle Funktionen enthält), danntypeidgibt es den tatsächlichen Typ des Objekts zurück.
  • typeid(T): gibt einstd::type_infoObjekt, das den Typ repräsentiertT。

Beispiel

Nachfolgend ein Beispiel unter Verwendung von<typeinfo>Ein einfaches Beispiel:

Beispiel

#include <iostream>
#include <typeinfo>

class Base {
public:
    virtual void show() { std::cout << "Base show" << std::endl; }
};

class Derived : public Base {
public:
    void show() override { std::cout << "Derived show" << std::endl; }
};

int main() {
    Base* basePtr = new Derived();
    Base* basePtr2 = new Base();

    std::cout << "Typ von basePtr: " << typeid(*basePtr).name() << std::endl;
    std::cout << "Typ von basePtr2: " << typeid(*basePtr2).name() << std::endl;

    if (typeid(*basePtr) == typeid(Derived)) {
        std::cout << "basePtr ist vom Typ Derived" << std::endl;
    } else {
        std::cout << "basePtr ist nicht vom Typ Derived" << std::endl;
    }

    delete basePtr;
    delete basePtr2;

    return 0;
}

Ausgabe:

Type of basePtr: 9Derived  // 注意:typeid的name()返回的类型名称可能因编译器而异
Type of basePtr2: 8Base     // 同上
basePtr is of type Derived

Hinweise

  • Die RTTI-Funktionalität hängt von der Compiler-Implementierung ab, dahertypeidDer vom Operator zurückgegebene Typname kann je nach Compiler variieren.
  • Die Verwendung von RTTI kann einen gewissen Einfluss auf die Programmleistung haben, da zur Laufzeit eine Typüberprüfung erforderlich ist.
  • RTTI ist nur auf polymorphe Typen anwendbar, d. h. Klassen mit virtuellen Funktionen.

<typeinfo>Es bietet eine Methode, um Objekttypen zur Laufzeit zu identifizieren, was für die Implementierung von Polymorphie und Typsicherheit sehr nützlich ist. Entwickler sollten RTTI jedoch mit Vorsicht verwenden, um unnötigen Leistungsaufwand und potenzielle Typfehler zu vermeiden.

Weitere Erweiterungen