On Saturday 16 November 2013 22:15:18 Antony Polukhin wrote:
2013/11/16 Andrey Semashev
On Saturday 16 November 2013 19:46:25 Antony Polukhin wrote:
2013/11/16 Andrey Semashev
<...>
I don't think there's any use for template_index, as I outlined in my
review. type_index already has all the functionality and should work whether or not RTTI is enabled.
template_index and type_index are two different types intentionally. It's the last attempt to notify user that he has done something wrong:
// This is an interface of some library. Library is compiled without RTTI, // user uses this header with RTTI on. void some_function(boost::type_index& ti);
If template_index and type_index are two different types and BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY is not defined, then user will get a linker error on GCC. If those two classes were exactly the same type, there'll be no link error. But user will get undefined behavior with hard detectable errors.
That does not require two different types, such as template_index and type_index. You can define a single type_index in an inline namespace, which name depends on the use of native RTTI. For C++03, a regular namespace and a using declaration would suffice. That way all user's code will just always use type_index, and there will be linking errors in case of configuration inconsistencies. Having two different interface classes instead divides the world in two parts and creates integration problems for users. Imagine library A uses template_index and library B uses type_index. How would these libraries coexist in a user's application, which is happy to use native RTTI? And what are the guidelines for library writers on choosing between these two types? IMO, there should be a single type_index class, which should work in both modes.