...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
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 |
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:
boost::typeindex::ctti_type_index::type_id<int>().name()
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
boost::typeindex::ctti_type_index::type_id<int>().name_demangled()
returns "int"
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
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 = ")