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é
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro