наследование — C ++: построение простой пользовательской системы RTTI поверх существующей

В течение нескольких дней я пытался создать простую систему RTTI на C ++. Использование шаблонов и typeid оператор я пробовал разные подходы, которые все работают следующим образом

  • Ручная регистрация типов при статической инициализации с использованием чего-то вроде Type::add<T>(name) где T является производным от общего базового класса, например, Base,
  • Использование статических методов, таких как Type::of<T>() или же Type::of(const Base& obj) чтобы получить Type объект, связанный с типом T или тип времени выполнения obj соответственно.
  • Наиболее важно: возможность проверить, является ли тип производным от другого, используя параметр шаблона или Type только объекты, например someType.is<T>() или же someType.is(const Type& base),

Хотя большинство этих функций реализованы быстро, я не смог найти правильного / эффективного решения для самого последнего, то есть проверить, является ли один тип производным от другого, когда дано два Type объекты, например что-то вроде

// Check if 'typeA' is a base class of 'typeB'
bool isBaseOf(const Type& typeA, const Type& typeB)
{
return typeB.is(typeA); // <- how to implement that?
}

Одним из очевидных решений является хранение базовых классов каждого зарегистрированного типа и обход иерархии на каждом Type::is(const Type&) вызов. Хотя это, безусловно, сработает, я не могу себе представить, что это эффективно. Я бы предпочел использовать встроенную систему RTTI, если это как-то возможно. Если бы я сохранил соответствующий std::type_info в каждом из моих Type объекты, я мог бы использовать первый для проверки наследования. К сожалению, из того, что я прочитал в

это невозможно напрямую, по крайней мере, портативным способом. Итак, наконец, возникает вопрос (ы): есть ли способ сделать то, что я хочу, без сохранения и постоянного обхода иерархии наследования? Знаете ли вы какую-либо статью / пример простой системы C ++ RTTI, реализующей вышеупомянутые функции? Все, что я нашел, были либо статьи о том, как должен работать RTTI, без фактической реализации, либо сложные реализации с дополнительными функциями, такими как автоматическая (де) сериализация и т. Д.
Я был бы рад поделиться кодом, если я заставлю его работать должным образом, если кто-то еще борется с той же проблемой.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]