typeid, operator

Składnia

typeid(type-id)
typeid(expression)

Uwagi

Operator typeid umożliwia określenie typu obiektu w czasie wykonywania.

typeid Wynikiem funkcji jest .const type_info& Wartość jest odwołaniem do type_info obiektu, który reprezentuje typ-id lub typ wyrażenia, w zależności od tego, która forma typeid jest używana. Aby uzyskać więcej informacji, zobacz type_info Class (Klasa type_info).

Operator typeid nie działa z typami zarządzanymi (deklaratorami abstrakcyjnymi lub wystąpieniami). Aby uzyskać informacje na temat pobierania Type określonego typu, zobacz typeid.

Operator typeid sprawdza czas wykonywania, gdy jest stosowany do wartości l typu klasy polimorficznej, gdzie prawdziwy typ obiektu nie może być określany przez podane informacje statyczne. Takie przypadki są:

  • Odwołaniem do klasy

  • Wskaźnik, wyłuszczenie z *

  • Wskaźnik w indeksie dolnym ([ ]). (Nie można bezpiecznie użyć indeksu dolnego ze wskaźnikiem do typu polimorficznego).

Jeśli wyrażenie wskazuje typ klasy bazowej, ale obiekt jest w rzeczywistości typem pochodzącym z tej klasy bazowej, type_info wynikiem jest odwołanie dla klasy pochodnej. Wyrażenie musi wskazywać typ polimorficzny (klasa z funkcjami wirtualnymi). W przeciwnym razie wynik jest type_info wynikiem dla klasy statycznej, o której mowa w wyrażeniu. Ponadto wskaźnik musi zostać wyłuszony, tak aby używany obiekt był tym, do którego wskazuje. Bez wyłudzenia wskaźnika wynik będzie type_info wskaźnikiem, a nie tym, co wskazuje. Na przykład:

// expre_typeid_Operator.cpp
// compile with: /GR /EHsc
#include <iostream>
#include <typeinfo>

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

Jeśli wyrażenie wyłusza wskaźnik, a wartość tego wskaźnika wynosi zero, typeid zgłasza wyjątek bad_typeid. Jeśli wskaźnik nie wskazuje prawidłowego obiektu, zgłaszany __non_rtti_object jest wyjątek. Wskazuje to próbę przeanalizowania RTTI, która wyzwoliła błąd, ponieważ obiekt jest w jakiś sposób nieprawidłowy. (Na przykład jest to zły wskaźnik lub kod nie został skompilowany z /GR).

Jeśli wyrażenie nie jest wskaźnikiem, a nie odwołaniem do klasy bazowej obiektu, wynik jest odwołaniem type_info reprezentującym statyczny typ wyrażenia. Statyczny typ wyrażenia odnosi się do typu wyrażenia, który jest znany w czasie kompilacji. Semantyka wykonania jest ignorowana przy ocenie typu statycznego wyrażenia. Ponadto, odwołania są ignorowane, gdy to możliwe przy określaniu typu statycznego wyrażenia:

// expre_typeid_Operator_2.cpp
#include <typeinfo>

int main()
{
   typeid(int) == typeid(int&); // evaluates to true
}

typeid Można również użyć w szablonach do określenia typu parametru szablonu:

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

Zobacz też

Informacje o typach uzyskiwane w czasie rzeczywistym
Słowa kluczowe