Operador typeid

Operador typeid
Información sobre la plantilla
Concepto:Permite obtenerse el tipo de objetos y expresiones en tiempo de ejecución, además de comprobar si un objeto es de un tipo particular, y si dos objetos son del mismo tipo

Operador typeid. La palabra clave typeid identifica un operador con el que puede obtenerse el tipo de objetos y expresiones en tiempo de ejecución. Permite comprobar si un objeto es de un tipo particular, y si dos objetos son del mismo tipo. Este tipo de identificación en tiempo de ejecución es conocida abreviadamente como RTTI.

Sintaxis

typeid( expresion )
typeid( nombre-de-tipo )

Ejemplo

cout << typeid(int).name() << endl;
int x = 10, z = 20;
cout << typeid(x).name() << endl;
const type_info & ref = typeid(int);
cout << ref.name() << endl;

Descripción

El operador typeid acepta dos variantes sintácticas que adoptan la forma de función. En la primera, el operando es una expresión que adopta el papel de argumento de la función; una llamada a esta función devuelve una referencia a un objeto de tipo constante, type_info.

El objeto type_info

typeid devuelve una referencia a un objeto de tipo constante que describe el tipo del operando. Este objeto es la instancia de una clase denominada type_info que dispone de los operadores == y != que pueden utilizarse para comprobar si dos objetos son del mismo tipo. Esto significa que cuando utilizamos una expresión como:

if (typeid( X ) == typeid( Z ))

el operador == es una versión específica (sobrecargada) del operador igualdad para la clase type_info. Esta clase también dispone de sendos métodos: name() y before() a disposición del usuario. Recuerde que para utilizar la clase type_info es necesario incluir el fichero de cabecera <typeinfo>. El resultado del operador es la referencia a un objeto de una clase, y que este objeto solo puede ser utilizado mediante dos métodos y dos operadores para comparación. Cuando el operador typeid se intenta aplicar a un operando que es la deferencia de un puntero nulo, se lanza la excepción bad_typeid. Aunque puede usarse con cualquier objeto, este operador se ha pensado para obtener el tipo de objetos polimórficos.

RTTI

El mecanismo C++ que permite determinar en tiempo de ejecución el tipo de un objeto, se conoce generalmente por su acrónimo inglés RTTI ("Run time type identification"). Este sistema es una parte importante del mecanismo de comprobación de tipos del lenguaje y permite la identificación incluso cuando el objeto solo es accesible mediante un puntero o referencia. Por ejemplo, el sistema hace posible convertir un puntero a clase-base virtual en puntero a clase derivada. Recordar que para realizar modelados en tiempo de ejecución debe utilizarse el operador dynamic_cast. Este mecanismo también permite comprobar si un objeto es de un tipo particular y cuando dos objetos son del mismo o distinto tipo. Esto puede hacerse con el operador typeid. El mecanismo RTTI forma parte de un sistema más amplio de funciones y/o clases de la Librería Estándar C++ que proporcionan determinadas funcionalidades de tiempo de ejecución Soporte de runtime).

Deshabilitar el mecanismo RTTI

La utilización del mecanismo RTTI produce cierta sobrecarga en tiempo de ejecución, por lo que la mayoría de compiladores disponen de una opción para habilitarlo o deshabilitarlo a voluntad. En concreto, C++ Builder dispone de una opción de compilación, el comando -RT-, que provoca que no se genere código que permite la identificación de tipos en tiempo de ejecución (RTTI). Por defecto su estado es activado (ON). Por su parte, el compilador GNU gcc dispone de la opción -fno-rtti cuya finalidad es análoga. Recordar también que esta opción puede ser incluida de forma particular en la declaración de clases. Si se activa la opción de habilitar limpieza total de destructores para el manejo de excepciones, también se necesita activar esta opción. También es necesaria si se desea utilizar el operador dynamic_cast, que se basa en este mecanismo para comprobar si el modelado está permitido o no.

Véase también

Fuente