Оператор typeid является выражением lvalue, относящийся к объекту со статической продолжительностью хранения полиморфного типа const std::type_info или некого другого типа, полученного от него. Используется там, где требуется информация о динамическом типе или типе среды выполнения объекта.
Операция typeid возвращает информацию времени выполнения type_info, о типе или выражении. Перед использованием typeid необходимо включить в заголовок программы библиотеку <typeinfo>.
Две формы операции typeid
typeid(type);
typeid(expression);
Параметры typeid
- type – параметр передается, когда требуется информация о типе переменной или объекта во время выполнения программы.
- expression – параметр передается, когда требуется информация о типе времени выполнения выражения. Сначала выражение оценивается, затем предоставляется информация о типе конечного результата.
Во всех случаях CV-квалификаторы игнорируются операцией typeid, т.е. typeid(const T) == typeid(T).
- Если операнд typeid является типом класса или ссылкой на тип класса, то этот тип класса не должен быть неполным типом.
- Если typeid используется в строящемся или разрушаемом объекте (в деструкторе или в конструкторе, включая список инициализатора конструктора или инициализаторы членов), тогда объект std::type_info, на который ссылается typeid, представляет класс, который создается или уничтожается, даже если класс не самый производный.
Операнд typeid может включать накладные расходы времени выполнения (поиск в виртуальной таблице), когда выражение полиморфного типа. В противном случае typeid выполняется во время компиляции.
const std::type_info& ti1 = typeid(A);
const std::type_info& ti2 = typeid(A);
assert(&ti1 == &ti2); // false
assert(ti1.hash_code() == ti2.hash_code()); // true
assert(std::type_index(ti1) == std::type_index(ti2)); // true
Пример №1 – typeid переменная или объект
#include <iostream>
#include <typeinfo>
using namespace std;
int main()
{
int i, j;
char c;
// Получаем информацию о типе с помощью оператора typeid
const type_info& ti1 = typeid(i);
const type_info& ti2 = typeid(j);
const type_info& ti3 = typeid(c);
// Проверяем одинаковые оба типа или нет
if (ti1 == ti2)
cout << "i и j" << " имеют схожий тип" << endl;
else
cout << "i и j" << " имеют разный тип" << endl;
// Проверяем одинаковые оба типа или нет
if (ti2 == ti3)
cout << "j и c" << " имеют схожий тип" << endl;
else
cout << "j и c" << " имеют разный тип" << endl;
return 0;
}
Output
i и j имеют схожий тип
j и c имеют разный тип
Пример №2 – typeid выражение
#include <iostream>
#include <typeinfo>
using namespace std;
int main()
{
int i = 5;
float j = 1.0;
char c = 'a';
// Получаем информацию о типе
const type_info& ti1 = typeid(i * j);
const type_info& ti2 = typeid(i * c);
const type_info& ti3 = typeid(c);
// Выводим информацию о типе
cout << "ti1 является типом " << ti1.name() << endl;
cout << "ti2 является типом " << ti2.name() << endl;
cout << "ti3 является типом " << ti3.name() << endl;
return 0;
}
Output
ti1 является типом f
ti2 является типом i
ti3 является типом c