boost :: any нарушает принцип подстановки Лискова

Я обнаружил, что невозможно извлечь ссылку на базовый тип из boost::any который содержит производный тип:

boost::any holder = Derived();
const Base& base_ref = boost::any_cast<const Base&>(holder);

бросает boost::bad_any_cast исключение.

Кажется, это нарушение Принцип подстановки Лискова и не очень удобно. Есть ли обходные пути?

4

Решение

Я не думаю, что это «нарушает» это — boost::any не предназначен для того, что вы используете.

Он специально предназначен для работы с типами значений (см. Документы, на которые вы уже разместили ссылку).

Вы должны any_cast точно указать тип переменной any; под капотом он проверяет типид. Очевидно, что const Base& не подходит для Derived в этом случае.

std::shared_ptr< Base > обеспечивает / почти / то, что вы, кажется, хотите. Или увидеть Вот для получения дополнительной информации.

5

Другие решения

Принцип замещения все еще применяется в том смысле, что код компилируется и работает. Дизайн boost::any таков, что он вызывает исключение (и вы можете восстановить его, если хотите).

Альтернативный дизайн boost::any может выбрать что-то другое. Для более детальной версии boost :: any вы можете взглянуть на Boost.TypeErasure. (Хотя наверное std::unique_ptr будет делать ту работу, которую вы хотите.)

0

По вопросам рекламы [email protected]