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;
cin.get();
return 0;
}
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.
© Agosto de 2003 Salvador Pozo, salvador@conclase.net