Учись программированию на C++ Builder бесплатно!
Содержание[Скрыть]

Оператор 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
Поделиться