Поделиться через


оператор 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 );
}

См. также

Ссылки

Сведения о типах во время выполнения

Ключевые слова C++