Operator TypeID
typeid( type-id )
typeid( expression )
Uwagi
typeid Operatora pozwala typ obiektu, które zostaną określone w czasie wykonywania.
Wynik typeid jest consttype_info &. Wartość jest odwołaniem do type_info obiekt, który reprezentuje, albo identyfikator typu lub typu wyrażenie, w zależności od formę, która typeid jest używana.Zobacz type_info klasy Aby uzyskać więcej informacji.
typeid Operator nie działa z typów zarządzanych (declarators abstrakcyjna lub wystąpień), zobacz TypeID Aby uzyskać informacje dotyczące uzyskiwania Type określonego typu.
typeid Jest operator wyboru run-time, gdy jest stosowany do wartości l typu klasy polimorficzna gdzie true type obiektu nie można określić statyczne informacje dostarczone.Takie przypadki są:
Odwołanie do klasy
Wskaźnik, usunąć odwołania z *
Jako wskaźnik (tj.[ ]).(Należy zauważyć, że ogólnie nie jest bezpieczne za pomocą wskaźnika typu polimorficzna indeks dolny).
Jeśli wyrażenie wskazuje typ klasy podstawowej, jeszcze obiektu jest faktycznie typu pochodną klasy bazowej, type_info orzeczenia w klasie pochodnej jest wynikiem.Wyrażenie muszą odnosić się do typu polimorficzna (klasa funkcje wirtualnych).W przeciwnym razie wynikiem jest type_info dla klas statycznych, o których mowa w wyrażenie.Ponadto wskaźnik musi można usunąć odwołania, tak, aby obiekt, który wskazuje na jest używane.Bez cofając wskaźnik, wynik będzie type_info dla wskaźnika, nie to może 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 wyrażenie jest cofając wskaźnik, i że jego wartość wynosi zero, typeid wyrzuca wyjątek bad_typeid.Jeśli kursor nie wskazuje na prawidłowy obiekt __non_rtti_object jest wyjątek, wskazując próba RTTI, który wywołał błąd analizowania (np. naruszenie dostępu), ponieważ obiekt jakoś jest nieprawidłowy (zły wskaźnik lub kod nie został skompilowany z się przełączników /GR).
Jeśli wyrażenie jest odwołanie do obiektu, klasa podstawowa ani wskaźnik jest wynikiem type_info odwołanie reprezentującego statyczne typu wyrażenie.Statyczne typu wyrażenia odwołaniem do typu wyrażenia są znane w czasie kompilacji.Semantyka wykonanie są ignorowane przy ocenie statyczne typu wyrażenia.Ponadto odwołania są ignorowane, gdy to możliwe przy określaniu statyczne typu 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 z parametrem 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 );
}