opérateur de typeid
typeid( type-id )
typeid( expression )
Notes
L'opérateur d' typeid permet le type d'un objet à déterminer au moment de l'exécution.
le résultat d' typeid est const type_information&.La valeur est une référence à un objet de type_information qui représente le type-identificateur ou le type de l'expression, selon le formulaire d' typeid est utilisé.Consultez classe de type_information pour plus d'informations.
L'opérateur d' typeid ne fonctionne pas avec les types managés (les déclarateurs abstraits ou les instances), consultez typeid pour plus d'informations sur l'obtention d' Type d'un type spécifié.
L'opérateur d' typeid fait un contrôle à l'exécution lorsqu'il est appliqué à une l-value d'un type polymorphe de classe, où le type réel de l'objet ne peut pas être déterminé par les informations statiques fournies.de tels cas sont :
une référence à une classe
un pointeur, déréférencé avec *
Un pointeur indicé (c. autrement dit.[ ]).(Notez qu'il n'est généralement pas possible d'utiliser un indice avec un pointeur vers un type polymorphe.)
Si les points d'expression à une classe de base tapez, mais l'objet est réellement d'un type dérivé de cette classe de base, une référence de type_information pour la classe dérivée est le résultat.L'expression doit pointer vers un type polymorphe (une classe avec des fonctions virtuelles).Sinon, le résultat est type_information pour la classe statique référencée dans l'expression.De plus, le pointeur doit être déréférencé afin que l'objet qu'il pointe est utilisé.Sans supprimer la référence du pointeur, le résultat sera type_information pour un pointeur, pas ce qu'elle désigne.Par exemple :
// expre_typeid_Operator.cpp
// compile with: /GR /EHsc
#include <iostream>
#include <typeinfo.h>
class Base {
public:
virtual void vvfunc() {}
};
class Derived : public Base {};
using namespace std;
int main() {
Derived* pd = new Derived;
Base* pb = pd;
cout << typeid( pb ).name() << endl; //prints "class Base *"
cout << typeid( *pb ).name() << endl; //prints "class Derived"
cout << typeid( pd ).name() << endl; //prints "class Derived *"
cout << typeid( *pd ).name() << endl; //prints "class Derived"
delete pd;
}
si l' expression déréférence un pointeur, et cette valeur du pointeur est zéro, typeid lève exception de bad_typeid.Si le pointeur n'indique pas d'objet valide, une exception d' __non_rtti_object est levée, indiquant une tentative d'analyse le RTTI que déclenché un défaut (comme la violation d'accès), car l'objet est d'une manière non valide (le pointeur incorrect ou le code n'ont pas été compilé avec /GR).
Si l'expression n'est ni un pointeur ni une référence à une classe de base de l'objet, le résultat est une référence de type_information représentant le type statique de l'expression.Le type statique d'une expression fait référence au type d'une expression telle qu'elle est connue au moment de la compilation.la sémantique d'exécution sont ignorées en évaluant le statique d'une expression.De plus, les références sont ignorées si possible en divisant le statique d'une expression :
// expre_typeid_Operator_2.cpp
#include <typeinfo>
int main()
{
typeid(int) == typeid(int&); // evaluates to true
}
typeid peut également être utilisé dans des modèles pour déterminer le type d'un paramètre de modèle :
// expre_typeid_Operator_3.cpp
// compile with: /c
#include <typeinfo>
template < typename T >
T max( T arg1, T arg2 ) {
cout << typeid( T ).name() << "s compared." << endl;
return ( arg1 > arg2 ? arg1 : arg2 );
}