Что, если таковые имеются, существуют конструкции 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
» и т. д.? Если у меня есть это, есть ли безопасный способ на самом деле выполнить этот акт?