оператор typeid
typeid( type-id )
typeid( expression )
Заметки
typeid оператор позволяет тип подлежащего определению объекта во время выполнения.
Результат ИД типа a Const type_information&.Значение ссылки к a type_info объект, представляющий значение тип-ИД тип Выражениев зависимости от которого является форма typeid используется.См. класс type_information для получения дополнительных сведений.
typeid оператор не работает с управляемыми типами (абстрактные деклараторы или экземпляров), cм. typeid сведения о получении значений Type заданного типа.
typeid оператор выполняет проверку среды выполнения при применении к l-значению полиморфный типа класса, истинный тип объекта не может быть определен статический предоставленные сведения.Такие случаи:
Ссылка на класс
Указатель, разыменованный *
Subscripted указатель (т е[ ]).(Обратите внимание, что обычно не может безопасно использовать индекс с указателем на полиморфный тип.)
Если Выражение указывает на тип базового класса, но на самом деле объект типа, производного от базового класса, a type_info ссылка для производного класса результат.Выражение указывать на полиморфный тип (класс с виртуальными функциями).В противном случае результат type_info для статического класса в сослал Выражение.Кроме того, необходимо разыменования указателя таким образом, чтобы оно указывало на объект будет использоваться.Без разыменования указателя, результат будет type_info для указателя, не - оно указывает.Примеры.
// 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;
}
Если Выражение разыменовывает указатель, и ноль, то значение указателя ИД типа создает a исключение bad_typeid.Если указатель не указывает на допустимый объект, a __non_rtti_object исключение, указывающее попытки проанализировать RTTI, активировало ошибка (например Нарушение прав доступа), поскольку объект каким-либо образом недопустим (недопустимый указатель или код не компилировались с /GR).
Если Выражение ни указателя, ни ссылки на базовый класс объекта, а результат type_info ссылка представляет собой статический тип Выражение.статический тип выражения относится к типу выражений, так как известно во время компиляции.Семантика выполнения не учитывается при оценке статический тип выражения.Кроме того, ссылки пропускаются при возможности, указав статический тип выражения:
// expre_typeid_Operator_2.cpp
#include <typeinfo>
int main()
{
typeid(int) == typeid(int&); // evaluates to true
}
ИД типа может также использоваться в шаблонах для указания типа параметров шаблона:
// 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 );
}