![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
RTTI emulation limitationsBoost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 38. Boost.TypeIndex 4.1
|
![]() |
Warning |
---|---|
С RTTI могут рухнуть классы с одинаковыми именами, определенными в разных модулях в анонимных пространствах имен: // In A.cpp namespace { struct user_defined{}; } type_index foo_a() { return type_id<user_defined>(); } // In B.cpp namespace { struct user_defined{}; } type_index foo_b() { return type_id<user_defined>(); } // In main.cpp assert(foo_a() != foo_b()); // will fail on some compilers Компиляторы, имеющие такое ограничение:GCC, CLANG, Intel. Тест:Вы можете проверить эту проблему, запустив< |
Если во время компиляции произошла следующая ошибка
TypeIndex library could not detect your compiler. Please make the BOOST_TYPE_INDEX_FUNCTION_SIGNATURE macro use correct compiler macro for getting the whole function name. Define BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING to correct value after that.
Затем вы используете компилятор, который не был протестирован в этой библиотеке.
<BOOST_TYPE_INDEX_FUNCTION_SIGNATURE
>должен быть определен для компилятора конкретного макроса, который выводитвсюподпись функции, включая параметры шаблона.
Если вывод<boost::typeindex::ctti_type_index::type_id<int>().name()
>* возвращает не только<int
>, но и много текста вокруг<int
>* или вообще не возвращает тип, то вы используете компилятор, который не был протестирован с этой библиотекой, и вам нужно настроить макрос<BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING
>.
Вот краткая инструкция:
boost::typeindex::ctti_type_index::type_id<int>().name()
>BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING
>до<(skip_at_begin,skip_at_end,false,"")
>, гдеskip_at_begin
>равно количеству символов до первого появления<int
>на выходеskip_at_end
>равно числу знаков после последнего появления<int
>на выходеboost::typeindex::ctti_type_index::type_id<int>().name_demangled()
>возвращается "внутри"int
>, то определите BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING до<(skip_at_begin,skip_at_end,true,"T = ")
>, гдеskip_at_begin
>равно<skip_at_begin
>на шаге 2skip_at_end
>равно<skip_at_end
>на шаге 2"T = "
>равны знакам, которые прямо перед<int
>на выходе.BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING
>макрос.Рассмотрим следующий пример:
<boost::typeindex::ctti_type_index::type_id<int>().raw_name()
>возвращает «const char *__cdecl boost::detail::cttiskip_at_begin
>на<sizeof("const char *__cdecl boost::detail::ctti<")-1
>и<skip_at_end
>на<sizeof(">::n(void)")-1
>.
#define BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING (39, 6, false, "")
Другой пример:
<boost::typeindex::ctti_type_index::type_id<int>().raw_name()
>возвращает "static const char *boost::detail::cttiskip_at_begin
>на<sizeof("static const char *boost::detail::ctti<")-1
>и<skip_at_end
>на<sizeof("]")-1
>и последний параметр макроса на «Т =».
#define BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING (39, 1, true, "T = ")
Статья RTTI emulation limitations раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 38. Boost.TypeIndex 4.1 может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Chapter 38. Boost.TypeIndex 4.1 ::
реклама |