Получение имен типов во время компиляции в C ++ - PullRequest
4 голосов
/ 19 сентября 2011

Я хочу получить имя типа и распечатать его в целях отладки.Я использую следующий код:

#include <cxxabi.h>

inline const char* demangle(const char *s) {
    abi::__cxa_demangle(s, 0, 0, NULL);
}

template<typename T>
inline const char* type_name() {
    return demangle(typeid(T).name());
}

Он работает хорошо, но я полагаю, что это лишние затраты времени выполнения.Есть ли способ получить читабельную форму идентификаторов типов, которая вычисляется во время компиляции?Я думаю о чем-то, что выглядит следующим образом:

boost::mpl::type_name<MyType>::value

, который вернул бы строковую константу имени типа.

Как (не так строго) связанный вопрос: возможновыполнять обработку строк с помощью boost :: mpl?

Ответы [ 4 ]

5 голосов
/ 19 сентября 2011

Я не вижу typeid(T).name(), что приводит к накладным расходам во время выполнения.typeid(expr) да, если expr относится к полиморфному типу.

Похоже, что распутывание, вероятно, происходит во время выполнения, но с этим ничего не поделаешь.Если это только для отладки, то я действительно не буду беспокоиться об этом слишком сильно, если ваш профилировщик не покажет, что это приводит к тому, что ваша программа настолько сильно замедляется, что отладка других ее элементов вызывает проблемы.

2 голосов
/ 19 ноября 2012

У меня такая же потребность, я решил ее, используя __ FUNCTION __ maccro в статическом методе моего класса. Но вы должны выполнить некоторые рутинные вычисления на __ FUNCTION __ , чтобы извлечь имя класса. Вы должны сделать несколько шаблонных трюков, чтобы избежать вставки одного и того же кода в каждый класс. Если кому-то интересно, я могу почистить и перевести мой код с французского, чтобы опубликовать его.

Основным преимуществом этого метода является то, что вам не нужно включать RRTI . С другой стороны, извлечение имени класса может зависеть от компилятора.

1 голос
/ 19 сентября 2011

Вы можете использовать std :: map или аналогичную структуру данных (например, splay-деревья) для кеширования и доступа к деформированному имени относительно быстро. Хотя это не сделано во время компиляции, я сомневаюсь, что последнее возможно.

1 голос
/ 19 сентября 2011

Вы можете использовать std :: type_index для кэширования деформированных строк.

...