Что, если есть, конструкции С++ существуют для перечисления предков класса во время выполнения?
В принципе, у меня есть класс, который хранит указатель на любой объект, включая, возможно, примитивный тип (несколько похожий на 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
" и т.д.? Как только у меня есть это, есть ли безопасный способ выполнить этот бросок?