Curso de C++ v2.0
Consultas, lista de correo 'C++ Con Clase' 'C++ Con Clase' página de entrada Librerías estándar C Tabla de contenido Contactar con Webmaster
*Introducción
*1 Toma de contacto
*2 Variables I
*3 Funciones I: Declaración y definición
*4 Operadores I
*5 Sentencias
*6 Declaración de variables
*7 Normas para la notación
*8 Cadenas de caracteres
*9 Conversión de tipos
*10 Variables II: Arrays
*11 Variables III: Estructuras
*12 Variables IV: Punteros 1
*13 Operadores II: Más operadores
*14 Operadores III: Precedencia
*15 Funciones II: Parámetros por valor y referencia
*16 Variables V: Uniones
*17 Variables VI: Punteros 2
*18 Operadores IV: De bits y condicional
*19 Definición de tipos
*20 Funciones III
*21 Funciones IV: Sobrecarga
*22 Operadores V: Sobrecarga
*23 El preprocesador
*24 Funciones V: Recursividad
*25 Variables VII: Modificadores
*26 Espacios con nombre
*27 Clases I: Definiciones
*28 Declaración de clases
*29 Constructores
*30 Destructores
*31 El puntero this
*32 Sistema de protección
*33 Modificadores para miembros
*34 Más sobre funciones
*35 Operadores sobrecargados
*36 Herencia
*37 Funciones virtuales
*38 Derivación múltiple
*39 Trabajar con ficheros
*40 Plantillas
*41 Punteros a miembros
*42 Castings
 . static_cast<>
 . const_cast<>
 . reinterpret_cast<>
 . typeid
 . dynamic_cast<>
*43 Excepciones
*Ejemplos capítulos 1 a 6
*Ejemplos capítulos 8 y 9
*A Palabras reservadas C/C++
*B Trigrafos y símbolos alternativos
*C Librerías estándar
*D Streams
<< < > >>

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

<< < > >>