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
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de