Да что там, сам выступал с докладом, как такое сделать, и как мы это применили.
Но тут я нашел на еще одну реализацию, очень даже изящную (да, ты должен написать в комментарии, что Abseil это вообще-то классика жанра, а идея так вообще общеизвестна, и стыдно мне такое не знать)
Центральная идея проста. Пусть у нас есть вот такой класс:
namespace base_internal {
template <typename Type>
struct FastTypeTag {
static constexpr char kDummyVar = 0;
};
}
У нас есть шаблонный класс, в нем есть шаблонная константа. Для каждого типа Т, он объявит свою константу. Да, все константы будут равны нулю, но у каждой из них будет свой уникальный адрес (!)
А дальше дело техники - мы просто используем адрес в качестве идентефикатора.
template <typename Type>
constexpr FastTypeIdType FastTypeId() {
return FastTypeIdType(&base_internal::FastTypeTag<Type>::kDummyVar);
}
Это очень просто и изящно!
Ну и как многие другие способы получения Id типа - этот ломается в случае динамических библиотек. В каждой dll будет свой адрес константы и Id между разными dll будут расходиться.
Но идею я записал.