Какие есть конструкции 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
]» и т. д. .? Когда я получу это, есть ли безопасный способ выполнить это приведение?