Operador typeID
typeid( type-id )
typeid( expression )
Comentários
O typeid operador permite que o tipo de um objeto a ser determinado em tempo de execução.
O resultado de typeid é um consttype_info &. O valor é uma referência a um type_info objeto representando a identificação do tipo ou o tipo da expressão, dependendo de qual forma de typeid é usado.Consulte type_info a classe para obter mais informações.
O typeid operador não funciona com tipos gerenciados (declaradores abstratas ou instâncias), consulte typeID para obter informações sobre como obter o Type de um tipo especificado.
O typeid operador oferece uma verificação de tempo de execução quando aplicado a um l-value de um tipo de classe polimórfica, onde o verdadeiro tipo de objeto não pode ser determinado pelas informações estáticas fornecidas.Nesses casos são:
Uma referência a uma classe.
Um ponteiro, com a sua referência cancelado *
Um ponteiro subscrito (ou seja,[ ]).(Observe que geralmente não é seguro usar um subscrito com um ponteiro para um tipo polimórfico).
Se o expressão aponta para um tipo de classe base, ainda que o objeto é realmente de um tipo derivado dessa classe base, um type_info de referência para a classe derivada é o resultado.O expressão deve apontar para um tipo polimórfico (uma classe com funções virtuais).Caso contrário, o resultado é o type_info para a classe estática referida a expressão.Além disso, o ponteiro deve referência cancelado para que o objeto que ele aponta é usado.Sem cancelar a referência do ponteiro, o resultado será o type_info o ponteiro, não o que ele aponta.Por exemplo:
// expre_typeid_Operator.cpp
// compile with: /GR /EHsc
#include <iostream>
#include <typeinfo.h>
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 o expressão cancelar a referência de um ponteiro, e que o valor do ponteiro é zero, typeid lança um a exceção de bad_typeid.Se o ponteiro não aponta para um objeto válido, um __non_rtti_object exceção é lançada, o que indica uma tentativa de analisar o que disparou uma falha de RTTI (como a violação de acesso), porque o objeto de alguma forma é inválido (ponteiro incorreto ou o código não foi compilado com /GR).
Se o expressão nem um ponteiro como uma referência a uma classe base do objeto, o resultado é um type_info referência representando o tipo estático da expressão.O tipo estático de uma expressão faz a referência ao tipo de uma expressão como é conhecido em tempo de compilação.Semântica de 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, ao 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 de 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 );
}