Ce face operatorul typeid?
Raspuns
Operatorul typeid intoarce o referinta la un obiect tip const std::type_info ce permite identificarea tipului la run-time.
Exemple
Code: Select all
if(typeid(x) == typeid(y))
{
std::cout << "x and y have the same type" << std::endl;
}
Code: Select all
class CObject {/*...*/};
//...
if(typeid(x) == typeid(CObject))
{
std::cout << "x is of type class CObject" << std::endl;
}
Code: Select all
const type_info& ti = typeid(x);
std::cout << "The type name of x is " << ti.name() << std::endl;
Code: Select all
template <class T> bool is_equal(T x, T y)
{
const std::type_info& ti = typeid(T);
std::cout << "compare " << ti.name() << " types" << std::endl;
return x == y;
}
Code: Select all
#include <iostream>
class CBase
{
virtual void f() {}
};
class CFoo : public CBase{/*...*/};
class CBar : public CBase{/*...*/};
void DoSomething(CBase& rBase)
{
std::cout << "Type: " << typeid(rBase).name() << std::endl;
}
int main()
{
CFoo foo;
DoSomething(foo);
CBar bar;
DoSomething(bar);
return 0;
}
- In ultimul exemplu, clasa CBase este polimorfica (contine functii virtuale). Daca nu ar fi fost polimorfica atunci rezultatul ar fi indicat tipul 'class CBase' (static type, tipul parametrului rBase) si nu 'class CFoo' si respectiv 'class CBar' (dynamic type, tipul obiectului din clasa derivata la care refera/pointeaza rBase).
- Specificatorii const si volatile sunt ignorati de typeid
- Headerul <typeinfo>, in care se afla definitia clasei type_info, trebuie inclus inainte de folosirea operatorului typeid.
- ISO/IEC 14882:2003 - 5.2.8 Type identification
- [MSDN] typeid Operator
<< Back to C++ Index