operatore di typeid
typeid( type-id )
typeid( expression )
Note
typeid l'operatore consente il tipo di oggetto da determinare in fase di esecuzione.
il risultato di typeid è un oggetto const type_information&.Il valore è un riferimento a un oggetto type_information oggetto che rappresenta uno tipo-ID o il tipo di espressione, a seconda del form typeid viene utilizzato.vedere classe di type_information per ulteriori informazioni.
typeid l'operatore non funziona con i tipi gestiti (dichiaratori o istanze astratti), vedere typeid per informazioni su come ottenere Type di un tipo specificato.
typeid l'operatore esegue un controllo di runtime se applicato a un l-value di un tipo polimorfico della classe, in cui il tipo effettivo dell'oggetto non può essere determinato dalle informazioni statiche fornite.Questi casi sono:
Un riferimento a una classe
un puntatore, derefenziato con *
Un puntatore formattato ovvero.[ ]).Si noti che non è in genere consigliabile utilizzare un indice con un puntatore a un tipo polimorfico).
se espressione punta a un tipo di classe base, ma l'oggetto è effettivamente di un tipo derivato dalla classe base, a type_information il riferimento per la classe derivata rappresenta il risultato.espressione deve puntare a un tipo polimorfico (classe con funzioni virtuali.In caso contrario, il risultato sarà type_information per la classe statica denominata in espressione.Inoltre, il puntatore necessario dereferenziare in modo da utilizzare l'oggetto che indica.Senza la dereferenziazione del puntatore, il risultato sarà type_information per il puntatore, non a cui punta.Di seguito è riportato un esempio:
// 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;
}
se espressione è dereferenziazione di un puntatore e il valore del puntatore è zero, typeid genera un'eccezione eccezione del bad_typeid.se il puntatore non indica un oggetto valido, a __non_rtti_object l'eccezione viene generata, che indica un tentativo di analisi il RTTI che ha attivato un errore (ad esempio la violazione di accesso), perché l'oggetto è piuttosto non valido (errato puntatore o non è stato compilato con /GR).
se espressione non è un puntatore o un riferimento a una classe base dell'oggetto, il risultato è un oggetto type_information di riferimento che rappresenta il tipo statico di espressione.statico di un'espressione si riferisce al tipo di espressione mentre è noto in fase di compilazione.La semantica di esecuzione viene ignorata quando restituisce il tipo statico di un'espressione.Inoltre, i riferimenti vengono ignorati quando possibile per stabilire il tipo statico di un'espressione:
// expre_typeid_Operator_2.cpp
#include <typeinfo>
int main()
{
typeid(int) == typeid(int&); // evaluates to true
}
typeid può essere utilizzato nei modelli per determinare il tipo di parametro di modello:
// 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 );
}