Функция<boost::core::demangle>является обычным способом получения деманглированного имени символа. Он берет искалеченную строку, такую как те, которые возвращены<typeid(T).name()>на определенных реализациях, таких как<g++>, и возвращает свою распутанную, читаемую человеком форму. В случае, если деманглирование не удается (например, если<name>не может быть интерпретировано как испорченное имя), функция возвращается<name>.
#include<boost/core/demangle.hpp>#include<typeinfo>#include<iostream>template<classT>structX{};intmain(){charconst*name=typeid(X<int>).name();std::cout<<name<<std::endl;// prints 1XIiEstd::cout<<boost::core::demangle(name)<<std::endl;// prints X<int>}
В некоторых случаях может быть желательным более низкий уровень интерфейса. Например:
Предполагая, что деманглинг символов может потерпеть неудачу, пользователь хочет иметь возможность справиться с такими ошибками.
Пользователь должен пост-обработать распутанное имя (например, удалить общие пространства имен), и выделение временной строки с полным распутанным именем имеет значительные накладные расходы.
Функция<boost::core::demangle_alloc>выполняет деманглинг имени и возвращает указатель на строку с деманглированным именем, если это удалось, или<nullptr>иначе. Возвращаемый указатель должен быть передан<boost::core::demangle_free>для возврата ресурсов. Обратите внимание, что на некоторых платформах указатель, возвращенный<boost::core::demangle_alloc>, может относиться к строке, обозначенной<name>, поэтому эта строка должна оставаться неизменной в течение всего срока службы возвращаемого указателя.
Класс<boost::core::scoped_demangled_name>является охраной прицела, которая автоматизирует вызовы<boost::core::demangle_alloc>(по его конструкции) и<boost::core::demangle_free>(по разрушению). Струну с распутанным названием можно получить её<get>способом. Обратите внимание, что этот метод может вернуться<nullptr>, если деманглинг не удался.
#include<boost/core/demangle.hpp>#include<typeinfo>#include<iostream>template<classT>structX{};intmain(){charconst*name=typeid(X<int>).name();boost::core::scoped_demangled_namedemangled(name);std::cout<<name<<std::endl;// prints 1XIiEstd::cout<<(demangled.get()?demangled.get():"[unknown]")<<std::endl;// prints X<int>}
<core::demangle>был взят из<boost/exception/detail/type_info.hpp>, который, в свою очередь, был адаптирован из<boost/units/detail/utility.hpp>и<boost/log/utility/type_info_wrapper.hpp>.
Статья demangle раздела Chapter 1. Boost.Core Chapter 1. Boost.Core может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.