typeid – operátor
typeid( type-id )
typeid( expression )
Poznámky
Operátor typeid umožňuje určit typ objektu v době běhu.
Výsledek operátoru typeid je typ const type_info&.Hodnota odkazu na objekt typu type_info, který představuje buď typ type-id nebo typ výrazu podle toho, který tvar operátoru typeid se používá.Další informace naleznete v tématu Třída type_info.
Operátor typeid nepracuje se spravovanými typy (abstraktní deklarátory nebo instance), další informace o získání typu Type ze zadaného typu naleznete v tématu typeid (rozšíření komponent C++).
Operátor typeid provádí kontrolu za běhu při použití na l-hodnotu polymorfního typu třídy, kde nelze určit skutečný typ objektu pomocí poskytnutých statických údajů.Takové případy jsou:
Odkaz na třídu
Ukazatel, přístup přes ukazatel pomocí *
Indexovaný ukazatel (tj. [ ]). (Všimněte si, že není obecně bezpečné použití indexu s ukazatelem na polymorfní typ.)
Pokud výraz odkazuje na typ základní třídy, ale objekt je ve skutečnosti typu, který je odvozen ze základní třídy, je odkaz type_info odvozené třídy výsledkem.výraz musí odkazovat na polymorfní typ (třída s virtuálními funkcemi).Jinak je pro statické třídy uvedené ve výrazu výsledek typu type_info.Dále musí být ukazatel odkázán tak, aby se použil objekt, na který odkazuje.Bez odkázání ukazatele, bude pro ukazatel výsledkem typ type_info, nikoli odkazovaný typ.Příklad:
// 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;
}
Pokud je výraz odkazován ukazatelem a hodnota tohoto ukazatele je nula, operátor typeid vyvolá výjimku bad_typeid.Pokud ukazatel neodkazuje na platný objekt, je vyvolána výjimka __non_rtti_object označující pokus analyzovat RTTI, která způsobila chybu (např. porušení přístupu), protože objekt je nějakým způsobem neplatný (chybný ukazatel nebo kód nebyl zkompilován s možností /GR).
Pokud není výraz ukazatel ani odkaz na základní třídu objektu, je výsledkem odkaz na typ type_info představující statický typ výrazu.Statický typ výrazu odkazuje na typ výrazu, jak je znám v době kompilace.Sémantika provádění je při vyhodnocování statického typu výrazu ignorována.Kromě toho jsou odkazy ignorovány, pokud je to možné při stanovení statického typu výrazu:
// expre_typeid_Operator_2.cpp
#include <typeinfo>
int main()
{
typeid(int) == typeid(int&); // evaluates to true
}
Operátor typeid lze také použít v šablonách pro určení typu parametru šablony:
// 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 );
}