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
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla