В документации LLVM они упоминают, что используют "пользовательскую форму RTTI" , и именно по этой причине у них есть isa<>, cast<> и dyn_cast<> шаблонные функции.
Обычно чтение информации о том, что библиотека выполняет некоторые базовые функциональные возможности языка, является ужасным запахом кода и просто приглашает на запуск. Однако это LLVM, о котором мы говорим: ребята работают над компилятором С++ и средой выполнения С++. Если они не знают, что они делают, я довольно сильно напортачил, потому что предпочитаю clang версии gcc, которая поставляется с Mac OS.
Тем не менее, будучи менее опытным, чем они, мне остается недоумевать, каковы подводные камни нормального RTTI. Я знаю, что он работает только для типов, имеющих v-таблицу, но это вызывает только два вопроса:
- Поскольку вам просто нужен виртуальный метод для создания таблицы vtable, почему бы просто не отметить метод как
virtual? Виртуальные деструкторы, похоже, хороши в этом. - Если их решение не использует регулярный RTTI, любая идея, как он был реализован?