RTTI emulation limitations

| Home | Libraries | People | FAQ | More

## RTTI emulation limitations

TypeIndex has been tested and successfully work on many compilers.

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

### Define the BOOST_TYPE_INDEX_FUNCTION_SIGNATURE macro

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.

### Fixing pretty_name() output

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 = ")