Использование RTTI для определения графа наследования в C ++?

Какие есть конструкции C ++, если таковые имеются, для перечисления предков класса во время выполнения?

В основном , У меня есть класс, в котором хранится указатель на любой объект, включая, возможно, примитивный тип (что-то вроде boost :: any , который я не хочу использовать, потому что мне нужно сохранить право собственности на мои объекты) . Внутри,этот указатель является void * , но цель этого класса - обернуть void * безопасностью типов во время выполнения. Оператор присваивания является шаблоном, поэтому во время присваивания я беру typeid () входящего указателя и сохраняю его. Затем, когда я вернусь позже, я могу проверить typeid () типа приведения по сохраненному type_info . Если он не совпадает, приведение сгенерирует исключение.

Но есть проблема: кажется, я теряю полиморфизм. Скажем, B является базой D . Если я сохраню указатель на D в своем классе, то сохраненная информация type_info также будет иметь D . Позже мне может потребоваться получить указатель B . Если я использую метод своего класса для преобразования в B * , тогда typeid (B) == typeid (D) завершается ошибкой, и преобразование вызывает исключение, даже если D -> B преобразование безопасно. Dynamic_cast <> () здесь не применяется, так как я работаю с void * , а не с предком B или D .

Я хотел бы иметь возможность проверить is_ancestor (typeid (B), typeid (D)) . Возможно ли это? (И разве это не то, что dynamic_cast <> делает за кулисами?)

Если нет, то я все равно думаю о втором подходе: реализовать класс TypeInfo , производные классы которого являются шаблонными синглетонами. Затем я могу хранить любую информацию, которая мне нравится, в этих классах, а затем хранить указатели на них в моем классе AnyPointer . Это позволило бы мне более доступным способом генерировать / сохранять информацию о предках во время компиляции. Таким образом, при неудачном варианте № 1 (встроенный способ перечисления предков с учетом только информации, доступной во время выполнения), есть ли конструкция / процедура, которую я могу использовать, которая позволит автоматически сгенерировать и сохранить информацию о предках во время компиляции, предпочтительно без необходимо явно указать, что «класс A происходит от B и C ; C происходит от D ]» и т. д. .? Когда я получу это, есть ли безопасный способ выполнить это приведение?

18
задан trbabb 9 August 2011 в 07:07
поделиться