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