Существует ли переносимая оболочка для C ++ type_info, которая стандартизирует формат строки имени типа? - PullRequest
21 голосов
/ 12 декабря 2011

Формат вывода 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"

Эти функции являются лишь примерами, кто-то, кто лучше знает систему типов C ++, возможно, разработает лучший API.Тот, который меня интересует в base().Все функции вызовут исключение, если RTTI будет отключен или будет обнаружен неподдерживаемый компилятор.

Это похоже на то, что может реализовать Boost, но я нигде не могу его там найти.Есть ли переносимая библиотека, которая делает это?

Ответы [ 3 ]

2 голосов
/ 12 декабря 2011

Существуют некоторые ограничения, чтобы делать такие вещи в C ++, поэтому вы, вероятно, не найдете именно то, что вы хотите в ближайшем будущем. Мета-информация о типах, которые компилятор вставляет в скомпилированный код, также зависит от реализации RTL, используемой компилятором, поэтому сторонней библиотеке будет трудно выполнить хорошую работу, не полагаясь на недокументированные функции. каждого конкретного компилятора, который может сломаться в более поздних версиях.

Фреймворк Qt, насколько мне известно, ближе всего к тому, что вы намеревались. Но они делают это полностью независимо от RTTI. Вместо этого у них есть свой собственный «компилятор», который анализирует исходный код и генерирует дополнительные исходные модули с метаинформацией. Затем вы компилируете + связываете эти модули вместе со своей программой и используете их API для получения информации. Взгляните на http://doc.qt.nokia.com/latest/metaobjects.html

1 голос
/ 19 декабря 2011

Джереми Пак (из инфраструктуры плагинов Boost Extension), по-видимому, написал такую ​​вещь:

http://blog.redshoelace.com/2009/06/resource-management-across-dll.html

3. RTTI не всегда работает должным образом через границы DLL,Посмотрите классы type_info, чтобы узнать, как я справляюсь с этим.

Так что вы можете посмотреть там.


PS.Я вспомнил, потому что однажды исправил ошибку в этой области;это еще может добавить информацию, так что вот ссылка: https://stackoverflow.com/a/5838527/85371

0 голосов

GCC имеет __cxa_demangle https://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html

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

...