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