Существует ли переносная оболочка для С++ type_info, которая стандартизирует формат строки имени типа?
Формат вывода type_info::name()
является специфичным для реализации.
namespace N { struct A; }
const N::A *a;
typeid(a).name(); // returns e.g. "const struct N::A" but compiler-specific
Кто-нибудь написал оболочку, которая возвращает надежную, предсказуемую информацию о типе, которая одинакова для всех компиляторов. Множественные шаблонные функции позволят пользователю получить конкретную информацию о типе. Поэтому я мог бы использовать:
MyTypeInfo::name(a); // returns "const struct N::A *"
MyTypeInfo::base(a); // returns "A"
MyTypeInfo::pointer(a); // returns "*"
MyTypeInfo::nameSpace(a); // returns "N"
MyTypeInfo::cv(a); // returns "const"
Эти функции - это просто примеры, кто-то, кто лучше знает систему типа С++, может, вероятно, разработать лучший API. Меня интересует base()
. Все функции могут вызвать исключение, если RTTI был отключен или был обнаружен неподдерживаемый компилятор.
Это похоже на то, что Boost может реализовать, но я не могу найти его там нигде. Есть ли переносная библиотека, которая делает это?
Ответы
Ответ 1
В С++ есть некоторые ограничения, чтобы делать такие вещи, поэтому вы, вероятно, не найдете точно, чего хотите в ближайшем будущем. Мета-информация о типах, которые компилятор вставляет в скомпилированный код, также специфична для реализации RTL, используемой компилятором, поэтому для сторонней библиотеки было бы трудно выполнить хорошую работу, не полагаясь на недокументированные функции каждого конкретного компилятора, который может сломаться в более поздних версиях.
Основа Qt имеет, насколько мне известно, ближайшее к тому, что вы намеревались. Но они делают это полностью независимым от RTTI. Вместо этого у них есть свой "компилятор", который анализирует исходный код и генерирует дополнительные исходные модули с метаинформацией. Затем вы компилируете + связываете эти модули вместе с вашей программой и используете их API для получения информации. Взгляните на http://doc.qt.nokia.com/latest/metaobjects.html
Ответ 2
Джереми Пак (из фреймворка расширения Boost Extension), похоже, написал такую вещь:
http://blog.redshoelace.com/2009/06/resource-management-across-dll.html
3. RTTI не всегда работает так, как ожидалось, через границы DLL. Ознакомьтесь с классами type_info, чтобы узнать, как я с этим справляюсь.
Итак, вы можете посмотреть там.
PS. Я вспомнил, потому что однажды исправил ошибку в этой области; это может все еще добавить информацию, поэтому здесь ссылка: fooobar.com/questions/86082/...
Ответ 3
GCC имеет __cxa_demangle
https://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html
Если есть такие расширения для всех целевых компиляторов, вы можете использовать их для записи переносимой функции с макросами для обнаружения компилятора.