Подтвердить что ты не робот

Существует ли переносная оболочка для С++ 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 может реализовать, но я не могу найти его там нигде. Есть ли переносная библиотека, которая делает это?

4b9b3361

Ответ 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

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