БлогNot. Как в C++ программно узнать тип переменной?

Как в C++ программно узнать тип переменной?

Был вчера вопросик, а я не ответил впохыхах.

Коротко: для этого уже в стандарте C++98 есть оператор typeid:

#include <iostream>
#include <typeinfo>

int main() {

 int var = 5;
 std::cout << typeid(var).name();

 std::cin.get(); return 0;
}

Подробнее: посмотрим, как работает typeid со встроенными и с определёнными пользователем типами данных (прежде всего, классами).

Прилагаемый маленький листинг из консоли Visual Studio 2015, думаю, хорошо показывает суть дела.

#include <iostream>
#include <typeinfo>
using namespace std;

class Base {}; //Класс
class Derived : public Base {}; //Класс-потомок
class PolyBase { virtual void Member() {} }; //Полиморфный класс-предок в виртуальным методом
class PolyDerived : public PolyBase {}; //Потомок полиморфного класса

typedef int new_int; //Определели новый тип через typedef

int main() {
 cout << boolalpha; //Чтобы печатать true/false

 //Простые скалярные типы:
 cout << typeid(int).name() << " and " << typeid(new_int).name() << endl;
 cout << "int == new_int? ";
 cout << (typeid(int) == typeid(new_int)) << '\n'; //true

 //Предок и потомок:
 cout << typeid(Base).name() << " and " << typeid(Derived).name() << endl;
 cout << "Base == Derived? ";
 cout << (typeid(Base) == typeid(Derived)) << '\n'; //false

 //Не-полиморфные объекты, доступ через указатель:
 Base* ptrBase = new Derived();
 cout << typeid(Base).name() << " and " << typeid(*ptrBase).name() << endl;
 cout << "Base == *ptrBase? ";
 cout << (typeid(Base) == typeid(*ptrBase)) << '\n'; //true

 //Полиморфные объекты, доступ через указатель:
 PolyBase* ptrPolyBase = new PolyDerived();
 cout << typeid(PolyBase).name() << " and " << typeid(*ptrPolyBase).name() << endl;
 cout << "PolyBase == *ptrPolyBase? ";
 cout << (typeid(PolyBase) == typeid(*ptrPolyBase)) << '\n'; //false

 cin.get(); return 0;
}

14.03.2018, 10:31 [11080 просмотров]


теги: c++ учебное

К этой статье пока нет комментариев, Ваш будет первым