Share via


typeid – operátor

Syntaxe

typeid(type-id)
typeid(expression)

Poznámky

Operátor typeid umožňuje určit typ objektu za běhu.

Výsledkem typeid je .const type_info& Hodnota je odkaz na type_info objekt, který představuje id typu nebo typ výrazu v závislosti na tom, jakou formu typeid se používá. Další informace najdete v tématu type_info Třída.

Operátor typeid nefunguje se spravovanými typy (abstraktní deklarátory nebo instance). Informace o získání Type zadaného typu naleznete v tématu typeid.

Operátor typeid provede kontrolu za běhu při použití na l-hodnotu polymorfního typu třídy, kde skutečný typ objektu nelze určit zadanými statickými informacemi. Takové případy jsou:

  • odkaz na třídu,

  • Ukazatel, dereferenced s *

  • Ukazatel dolního indexu ([ ]). (Není bezpečné použít dolní index s ukazatelem na polymorfní typ.)

Pokud výraz odkazuje na typ základní třídy, ale objekt je ve skutečnosti typu odvozený z této základní třídy, type_info odkaz na odvozenou třídu je výsledkem. Výraz musí odkazovat na polymorfní typ (třída s virtuálními funkcemi). V opačném případě je type_info výsledkem pro statickou třídu uvedenou ve výrazu. Dále musí být ukazatel dereferenced tak, aby použitý objekt je ten, na který odkazuje. Bez zrušení odvozování ukazatele bude type_info výsledkem ukazatel, nikoli to, na co odkazuje. Příklad:

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

Pokud výraz dereferencuje ukazatel a hodnota ukazatele je nula, typeid vyvolá výjimku bad_typeid. Pokud ukazatel neodkazuje na platný objekt, __non_rtti_object vyvolá se výjimka. Označuje pokus o analýzu RTTI, který aktivoval chybu, protože objekt je nějak neplatný. (Jedná se například o chybný ukazatel nebo kód nebyl zkompilován pomocí /GR).

Pokud výraz není ukazatel, a ne odkaz na základní třídu objektu, je type_info výsledkem odkaz představující statický typ výrazu. Statický typ výrazu odkazuje na typ výrazu, jak je známo 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 při stanovení statického typu výrazu možné:

// expre_typeid_Operator_2.cpp
#include <typeinfo>

int main()
{
   typeid(int) == typeid(int&); // evaluates to true
}

typeid lze také použít v šablonách k 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é

Informace o typu modulu runtime
Klíčová slova