4z3o1d

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.
Compartir

Mi nombre es Alexander fundador y CEO, y me gusta llamarme un Geek. Amo la informática, tecnología y todo lo que está relacionado con ella. Inicié este sitio con la intención de compartir conocimientos como cursos en línea, tutoriales y videotutoriales. Estoy muy entusiasmado con la información que he descubierto y compartido hasta el momento. La verdad es que lo he hecho con el mayor de los gustos. Así es, soy un Geek con una visión para compartir conocimiento. Leer mas...