|  | 
|      | 
|  | 
| RTTI emulation limitationsBoost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 38. Boost.TypeIndex 4.1
  
   | |||||||||
| ![[Warning]](/img/warning.png) | 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 ::
| реклама |