Operador typeid

Sintaxis

typeid(type-id)
typeid(expression)

Comentarios

El operador typeid permite que se determine el tipo de un objeto en tiempo de ejecución.

Resultado de typeid es un const type_info&. El valor es una referencia a un objeto type_info que representa el type-id o el tipo de expression, dependiendo de la forma en que se use typeid. Para más información, consulte Clase type_info.

El operador typeid no funciona con tipos administrados (declaradores abstractos o instancias). Para obtener información sobre cómo obtener el Type de un tipo especificado, consulte typeid.

El operador typeid realiza una comprobación en tiempo de ejecución cuando se aplica a un valor de un tipo de clase polimórfico, en que el tipo verdadero del objeto no se puede determinar mediante la información estática proporcionada. Esos casos son:

  • Una referencia a una clase

  • Un puntero, desreferenciado con *

  • Un puntero con subíndice ([ ]). (No es seguro usar un subíndice con un puntero a un tipo polimórfico).

Si expression señala a un tipo de clase base, aunque el objeto sea realmente de un tipo derivado de esa clase base, el resultado es una referencia de type_info para la clase derivada. El elemento expression debe señalar a un tipo polimórfico (una clase con funciones virtuales). De lo contrario, el resultado es el type_info para la clase estática a que se hace referencia en la expression. Además, el puntero se debe desreferenciar para que el objeto usado sea el que señala. Si no se desreferencia el puntero, el resultado será el type_info para el puntero, no el objeto al que señala. Por ejemplo:

// expre_typeid_Operator.cpp
// compile with: /GR /EHsc
#include <iostream>
#include <typeinfo>

class Base {
public:
   virtual void vvfunc() {}
};

class Derived : public Base {};

using namespace std;
int main() {
   Derived* pd = new Derived;
   Base* pb = pd;
   cout << typeid( pb ).name() << endl;   //prints "class Base *"
   cout << typeid( *pb ).name() << endl;   //prints "class Derived"
   cout << typeid( pd ).name() << endl;   //prints "class Derived *"
   cout << typeid( *pd ).name() << endl;   //prints "class Derived"
   delete pd;
}

Si la expression desreferencia un puntero y el valor de ese puntero es cero, typeid produce una excepción bad_typeid. Si el puntero no apunta a un objeto válido, se produce una excepción __non_rtti_object. Indica un intento de analizar el RTTI que desencadenó un error porque el objeto no es válido de alguna manera. (Por ejemplo, es un puntero incorrecto o el código no se compiló con /GR).

Si la expression no es un puntero ni una referencia a una clase base del objeto, el resultado es una referencia de type_info que representa el tipo estático de la expresión. El elemento static type de una expresión se refiere al tipo de una expresión cuando se conoce en el tiempo de compilación. La semántica de ejecución se omite cuando se evalúa el tipo estático de una expresión. Además, las referencias se omiten cuando es posible al determinar el tipo estático de una expresión:

// expre_typeid_Operator_2.cpp
#include <typeinfo>

int main()
{
   typeid(int) == typeid(int&); // evaluates to true
}

typeid también se puede utilizar en las plantillas para determinar el tipo de un parámetro de plantilla:

// expre_typeid_Operator_3.cpp
// compile with: /c
#include <typeinfo>
template < typename T >
T max( T arg1, T arg2 ) {
   cout << typeid( T ).name() << "s compared." << endl;
   return ( arg1 > arg2 ? arg1 : arg2 );
}

Consulte también

Información de tipos en tiempo de ejecución
Palabras clave