Как в с++ получить имя типа переменной?

303
05 ноября 2017, 18:29

Помогите получить имя типа переменной.

Answer 1

Ну, нечто похожее - хотя не всегда точно и не всегда (вернее, не везде - в зависимости от компилятора) понятно - дает

typeid(var).name()

См., например, здесь. Но лучшего в стандарте не предусмотрено...

Answer 2

Используйте typeid - вывод типа времени выполнения:

#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;  
}  

Результат std::type_info::name ненадежен (проблема возникает при выводе типа аргумента шаблонной функции, например, а именно - тип аргумента рассматривается как если бы он был передан в шаблонную функцию по значению). Более точный ответ даст функция из фреймворка boost из <typeindex> (без отбрасывания const, volatile и &):

// In header: <boost/type_index.hpp>
template<typename T> type_index type_id_with_cvr();

Особенность ее в том, что она возвращает имя типа НЕ опуская ссылочность переменной и ее спецификаторы const и volatile. Вызывается она следующим образом:

type_index ti = type_id_with_cvr<int&>();
std::cout << ti.pretty_name();  // Outputs 'int&'

Пример использования type_id_with_cvr в шаблонной функции:

#include <boost/type_index.h> 
template<typename Т> 
void f(const Т& param)
{
    using std::cout;
    using boost::typeindex::type_id_with_cvr;
    cout << "Т : " << type_id_with_cvr<T>().pretty_name() << std::endl;
    cout << "param : " << type_id_with_cvr<decltype(param)>().pretty_пame() << std:endl;
}

Результатом работы будет выведен тип X в первом cout и тип X const& во втором.

READ ALSO
Не добавляется структура в &lt;set&gt;

Не добавляется структура в <set>

Не добавляется структура во множествоНе могу разобраться в ошибках в функции void initColor(), компилятор указывает на инструкцию isColrs

317
Не могу взять значение по итератору

Не могу взять значение по итератору

Как взятьsecond значение пары, на которую указывает

307
Реализация индексации в хэш-таблице на основе хэш-значений полученных с помощью md5 алгоритма

Реализация индексации в хэш-таблице на основе хэш-значений полученных с помощью md5 алгоритма

Используйте степень двойки для размера своей хэш-таблицы и берите младшие биты MD5 для индексации

232