Существует ли переносимая оболочка для С++ 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"

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

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


person paperjam    schedule 12.12.2011    source источник
comment
Я ничего не знаю, но, похоже, это хорошая идея. (Формально стандарт разрешает реализации возвращать "" для всех типов, но на практике большинство реализаций возвращают что-то непосредственно используемое, а те, которые не возвращают искаженное имя, которое можно разобрать.)   -  person James Kanze    schedule 12.12.2011
comment
Единственная проблема, которую я вижу, заключается в том, что строка полностью зависит от реализации и никоим образом не гарантирует точного представления самого типа. Хуже того, он может быть даже не уникальным.   -  person Matthieu M.    schedule 13.12.2011
comment
@Matthieu - библиотека обнаруживает такие компиляторы, и вызов завершается ошибкой. Звонящий должен жить с этим. Компиляторы, которые использует большинство из нас, дают полезную информацию в type_info.   -  person paperjam    schedule 13.12.2011


Ответы (3)


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

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

person Fabio Ceconello    schedule 12.12.2011
comment
Я не вижу большой проблемы. Лучше иметь что-то, что работает хотя бы с некоторыми компиляторами, чем ничего, имхо. - person zerm; 12.12.2011
comment
Я думаю, что это можно сделать надежным для всех компиляторов, потому что самотестирование тривиально с небольшими накладными расходами во время выполнения. - person paperjam; 12.12.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

person sehe    schedule 18.12.2011
comment
Я не уверен, что это делает именно то, о чем я прошу - меня интересует фактическая строка имени типа, а не сравнение типов. - person paperjam; 19.12.2011

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

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

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 18.06.2015