Operador typeid
La sintaxis de este operador es:
const type_info typeid(<tipo>)
const type_info typeid(<objeto>)
El tipo puede ser cualquiera de los fundamentales, derivados o una clase, estructura o unión. Si se trata de un objeto, también puede ser de cualquier tipo.
El valor de retorno un objeto constante de tipo type_info.
La clase type_info se define en el fichero de cabecera estándar "typeinfo". Tiene la siguiente declaración:
class type_info { public: virtual ~type_info(); private: type_info& operator=(const type_info&); type_info(const type_info&); protected: const char *__name; protected: explicit type_info(const char *__n): __name(__n) { } public: const char* name() const; bool before(const type_info& __arg) const; bool operator==(const type_info& __arg) const; bool operator!=(const type_info& __arg) const; ... }; |
Nos interesa, concretamente, la función "name", y tal vez, los operadores == y !=.
La función "name" nos permite mostrar el nombre del tipo a que pertenece un objeto, los operadores nos permiten averiguar si dos objetos son del mismo tipo, o clase o si dos clases o tipos son equivalentes, por ejemplo:
#include <iostream> #include <typeinfo> using namespace std; struct punto3D { int x,y,z; }; union Union { int x; float z; char a; }; class Clase { public: Clase() {} }; typedef int Entero; int main() { int x; float y; int z[10]; punto3D punto3d; Union uni; Clase clase; void *pv; cout << "variable int: " << typeid(x).name() << endl; cout << "variable float: " << typeid(y).name() << endl; cout << "array de 10 int:" << typeid(z).name() << endl; cout << "estructura global: " << typeid(punto3d).name() << endl; cout << "unión global: " << typeid(uni).name() << endl; cout << "clase global: " << typeid(clase).name() << endl; cout << "puntero void: " << typeid(pv).name() << endl; cout << "typodef Entero: " << typeid(Entero).name() << endl; if(typeid(Entero) == typeid(int)) cout << "int y Entero son el mismo tipo" << endl; return 0; } |
Ejecutar este código en codepad.
La salida, en Dev-C++, tiene esta forma:
variable int: i variable float: f array de 10 int:A10_i estructura global: 7punto3D unión global: 5Union clase global: 5Clase puntero void: Pv typodef Entero: i int y Entero son el mismo tipo |
La utilidad es detectar los tipos de objetos durante la ejecución, sobre todo en aplicaciones con frecuente uso de polimorfismo, y que requieran diferentes formas de manejar cada objeto en función de su clase.
Además de usar el operador typeid se puede usar el operador dynamic_cast, que se explica en el siguiente punto.
Comentarios