Как в 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 [11704 просмотра]