typeid — operator
typeid( type-id )
typeid( expression )
Uwagi
Operator typeid pozwala, aby typ obiektu był ustalony w czasie wykonywania.
Wynik typeid jest consttype_info&.Wartość jest odwołaniem do obiektu type_info, który reprezentuje type-id lub typ expression, w zależności od formy użycia typeid.Zobacz type_info Class, aby uzyskać wiecej informacji.
Operator typeid nie działa z typami zarządzanymi (abstrakcyjnymi deklaratorami lub wystąpieniami), zobacz TypeID, aby uzyskać informacje na temat uzyskiwania Type określonego typu.
Operator typeid wykonuje sprawdzanie w czasie wykonania po zastosowaniu l-wartości do typu polimorficznej klasy, gdzie prawidłowego typu obiektu nie można określić dostarczonymi statycznymi informacjami.Takie przypadki są:
Odwołaniem do klasy
Wskaźnikiem, usunięciem odwołania z *
Indeksem wskaźnika (tj.) [ ]). (Należy zauważyć, że ogólnie nie jest bezpieczne użycie indeksu dolnego z wskaźnikiem do typu polimorficznego).
Jeśli expression wskazuje na typ klasy bazowej, obiekt jest faktycznie typu pochodzącego z tej klasy bazowej, odwołanie type_info do klasy pochodnej jest wynikiem.expression musi wskazywać typ polimorficzny (klasa funkcji wirtualnych).W przeciwnym razie wynikiem jest type_info dla klasy statycznej określonej w expression.Ponadto wskaźnik musi usunąć odwołania, aby wskazywany przez nią obiekt był używany.Bez dereferencji wskaźnika, wynik będzie type_info dla wskaźnika, a nie tym, na co wskazuje.Na przykład:
// 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;
}
Jeśli expression jest usunięciem odwołania do wskaźnika, i że jego wartość wynosi zero, typeid wyrzuca wyjątek bad_typeid.Jeżeli wskaźnik nie wskazuje prawidłowego obiektu, wyjątek __non_rtti_object jest zgłoszony wskazując próbę analizowania RTTI, który wywołał błąd (jak naruszenie zasad dostępu), ponieważ obiekt jest z jakiegoś powodu nieprawidłowy (zły wskaźnik lub kod nie został skompilowany z /GR).
Jeśli expression nie jest ani wskaźnikiem ani odwołaniem do klasy bazowej obiektu, wynik jest odwołaniem type_info odpowiadającym typowi statycznego expression.Wyrażenie static type odwołuje się do typu wyrażenia jaki 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ż w szablonach w celu 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 );
}