Bibliothèque standard C++<typeinfo>

En C++,<typeinfo>Il fait partie de la bibliothèque standard, en fournissant la fonctionnalité d'identification des types à l'exécution (RTTI). RTTI permet aux programmes de déterminer le type d'un objet à l'exécution. Cela se fait en utilisanttypeidopérateur ettype_infoimplémenté par la classe.

type_infoLa classe est une classe de base abstraite qui fournit une interface pour les informations de type. Chaque type possède untype_infoobjet associé, qui peut êtretypeidaccessible par l'opérateur.

Syntaxe

<typeinfo>Syntaxe principale associée :

  • typeidOpérateur : utilisé pour obtenir les informations de type d'un objet.
  • type_infoclasse : une classe qui contient des informations de type.

classe d'informations de typetype_info

typeinfoLe fichier d'en-tête fournit une prise en charge à l'exécution des informations de type. Il contient principalement deux composants essentiels :std::type_infoclasse ettypeidOpérateurs.typeinfoIl permet au programme d'obtenir les informations de type de l'objet à l'exécution, ce qui est très utile dans le code polymorphe et sûr du point de vue des types. Voici une introduction àtypeinfoIntroduction détaillée :

classe std::type_info

std::type_infoLa classe esttypeinfoLa classe centrale du fichier d'en-tête, utilisée pour décrire un type. Elle fournit plusieurs fonctions membres pour interroger les informations de type. Les fonctions membres couramment utilisées sont les suivantes :

  • const char* name() const noexcept;Renvoie un pointeur de chaîne C vers le nom du type. Notez que ce nom n'est pas nécessairement un nom de type lisible par un humain ; son format est déterminé par l'implémentation du compilateur.

  • bool before(const std::type_info& rhs) const noexcept;compare deuxtype_infoobjets dans un certain ordre, en renvoyant si l'objet courant est avantrhsavant.

  • bool operator==(const std::type_info& rhs) const noexcept;comparer deuxtype_infosi les objets représentent le même type.

  • bool operator!=(const std::type_info& rhs) const noexcept;comparer deuxtype_infosi les objets représentent des types différents.

opérateur typeid

typeidL'opérateur est utilisé pour obtenir des informations de type au moment de l'exécution.typeidIl peut opérer sur des objets (pointeurs ou références avec comportement polymorphe) ou des types (sans instancier d'objet).

  • typeid(object): renvoie unstd::type_infoobjet, représentantobjectle type dynamique. SiobjectS'il s'agit d'un type polymorphe (c'est-à-dire qui contient des fonctions virtuelles), alorstypeidil renverra le type réel de l'objet.
  • typeid(T): renvoie unstd::type_infoobjet, représentant le typeT。

Exemple

Voici un exemple utilisant<typeinfo>Un exemple simple :

Exemple

#include <iostream>
#include <typeinfo>

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

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

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

    std::cout << "Type de basePtr: " << typeid(*basePtr).name() << std::endl;
    std::cout << "Type de basePtr2: " << typeid(*basePtr2).name() << std::endl;

    if (typeid(*basePtr) == typeid(Derived)) {
        std::cout << "basePtr est de type Derived" << std::endl;
    } else {
        std::cout << "basePtr n'est pas de type Derived" << std::endl;
    }

    delete basePtr;
    delete basePtr2;

    return 0;
}

Sortie :

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

Notes

  • La fonctionnalité RTTI dépend de l'implémentation du compilateur, par conséquenttypeidLe nom de type renvoyé par l'opérateur peut varier selon le compilateur.
  • L'utilisation de RTTI peut avoir un certain impact sur les performances du programme, car elle nécessite une vérification de type à l'exécution.
  • RTTI ne s'applique qu'aux types polymorphes, c'est-à-dire aux classes avec des fonctions virtuelles.

<typeinfo>Il fournit une méthode pour identifier les types d'objets à l'exécution, ce qui est très utile pour implémenter le polymorphisme et la sécurité de type. Cependant, les développeurs doivent utiliser RTTI avec prudence pour éviter une surcharge de performances inutile et d'éventuelles erreurs de type.

autres extensions