Compartilhar via


Operador typeid

Sintaxe

typeid(type-id)
typeid(expression)

Comentários

O operador typeid permite que o tipo de um objeto seja determinado em tempo de execução.

O resultado de typeid é um const type_info&. O valor é uma referência a um objeto type_info que representa o type-ID ou o tipo da expressão, dependendo do formato de typeid usado. Para mais informações, confira Classe type_info.

O operador typeid não funciona com tipos gerenciados (declaradores abstratos ou instâncias). Para informações sobre como obter o tipo Type especificado, confira typeid.

O operador typeid faz uma verificação de tempo de execução quando aplicado a um l-value de um tipo de classe polimórfica, em que o tipo true de objeto não pode ser determinado pelas informações estáticas fornecidas. Tais casos são:

  • Uma referência à classe

  • Um ponteiro, desreferenciado com *

  • Um ponteiro subscrito ([ ]). (Não é seguro usar um subscrito com um ponteiro para um tipo polimórfico.)

Se a expressão aponta para um tipo de classe base, mas o objeto é na realidade um tipo derivado dessa classe base, uma referência a type_info para a classe derivada é o resultado. A expressão deve apontar para um tipo polimórfico (uma classe com funções virtuais). Caso contrário, o resultado será type_info para a classe estática referenciada na expressão. Além disso, o ponteiro deve ser desreferenciado de modo que o objeto usado seja aquele para o qual ele aponta. Sem desreferenciar o ponteiro, o resultado será type_info para o ponteiro, não para o que ele aponta. Por exemplo:

// 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;
}

Se a expressão estiver desreferenciando um ponteiro e o valor desse ponteiro for zero, typeid gerará uma exceção bad_typeid. Se o ponteiro não apontar para um objeto válido, uma exceção __non_rtti_object será gerada. Isso indica uma tentativa de analisar o RTTI que disparou uma falha porque o objeto de alguma forma é inválido. (Por exemplo, é um ponteiro inválido ou o código não foi compilado com /GR).

Se a expressão não é um ponteiro nem uma referência a uma classe base do objeto, o resultado será uma referência a type_info que representa o tipo estático da expressão. O tipo estático de uma expressão se refere ao tipo de uma expressão, como se sabe no tempo de compilação. A semântica da execução é ignorada ao avaliar o tipo estático de uma expressão. Além disso, as referências são ignoradas quando possível para determinar o tipo estático de uma expressão:

// expre_typeid_Operator_2.cpp
#include <typeinfo>

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

typeid também pode ser usado em modelos para determinar o tipo de um parâmetro do modelo:

// 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 );
}

Confira também

Informações de tipo em tempo de execução
Palavras-chave