Sdílet prostřednictvím


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

Viz také

Referenční dokumentace

Informace běhového typu

Klíčová slova jazyka C++