Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

RTTI emulation limitations

Define the BOOST_TYPE_INDEX_FUNCTION_SIGNATURE macro
Fixing pretty_name() output

TypeIndex has been tested and successfully work on many compilers.

[Warning] Warning

With RTTI off classes with exactly the same names defined in different modules in anonymous namespaces may collapse:

// 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

Compilers that have that limitation: GCC, CLANG, Intel.

Test: you can test this issue by runing the testing_crossmodule_anonymous_no_rtti that can be build if you run ../../../b2 in type_index/test/ folder.

If you get the following error during compilation

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.

then you are using a compiler that was not tested with this library.

BOOST_TYPE_INDEX_FUNCTION_SIGNATURE must be defined to a compiler specific macro, that outputs the whole function signature including template parameters.

If the output of boost::typeindex::ctti_type_index::type_id<int>().name() * returns not just int but also a lot of text around the int * or does not return type at all then you are using a compiler that was not tested with this library and you need to setup the BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING macro.

Here is a short instruction:

  1. get the output of boost::typeindex::ctti_type_index::type_id<int>().name()
  2. define BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING to (skip_at_begin, skip_at_end, false, ""), where
    • skip_at_begin is equal to characters count before the first occurrence of int in output
    • skip_at_end is equal to characters count after last occurrence of int in output
  3. check that boost::typeindex::ctti_type_index::type_id<int>().name_demangled() returns "int"
  4. if it does not return int, then define BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING to (skip_at_begin, skip_at_end, true, "T = "), where
    • skip_at_begin is equal to skip_at_begin at step 2
    • skip_at_end is equal to skip_at_end at step 2
    • "T = " is equal to characters that are right before the int in output
  5. (optional, but highly recommended) create ticket with feature request to add your compiler to supported compilers list. Include parameters provided to BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING macro.

Consider the following example:

boost::typeindex::ctti_type_index::type_id<int>().raw_name() returns "const char *__cdecl boost::detail::ctti<int>::n(void)". Then you shall set skip_at_begin to sizeof("const char *__cdecl boost::detail::ctti<") - 1 and skip_at_end to sizeof(">::n(void)") - 1.

#define BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING (39, 6, false, "")

Another example:

boost::typeindex::ctti_type_index::type_id<int>().raw_name() returns "static const char *boost::detail::ctti<int>::n() [T = int]"". Then you shall set skip_at_begin to sizeof("static const char *boost::detail::ctti<") - 1 and skip_at_end to sizeof("]") - 1 and last parameter of macro to "T = ".

#define BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING (39, 1, true, "T = ")

PrevUpHomeNext