Я обнаружил, что невозможно извлечь ссылку на базовый тип из boost::any
который содержит производный тип:
boost::any holder = Derived();
const Base& base_ref = boost::any_cast<const Base&>(holder);
бросает boost::bad_any_cast
исключение.
Кажется, это нарушение Принцип подстановки Лискова и не очень удобно. Есть ли обходные пути?
Я не думаю, что это «нарушает» это — boost::any
не предназначен для того, что вы используете.
Он специально предназначен для работы с типами значений (см. Документы, на которые вы уже разместили ссылку).
Вы должны any_cast точно указать тип переменной any; под капотом он проверяет типид. Очевидно, что const Base&
не подходит для Derived
в этом случае.
std::shared_ptr< Base >
обеспечивает / почти / то, что вы, кажется, хотите. Или увидеть Вот для получения дополнительной информации.
Принцип замещения все еще применяется в том смысле, что код компилируется и работает. Дизайн boost::any
таков, что он вызывает исключение (и вы можете восстановить его, если хотите).
Альтернативный дизайн boost::any
может выбрать что-то другое. Для более детальной версии boost :: any вы можете взглянуть на Boost.TypeErasure. (Хотя наверное std::unique_ptr
будет делать ту работу, которую вы хотите.)