Condividi tramite


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 );
}

Vedere anche

Riferimenti

Informazioni sui tipi di runtime

Parole chiave C++