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