В общих реализациях алгоритмов предпочтительно использовать семантику значений: при копировании объекта существуют два идентичных объекта, которые являются независимыми.Это важное свойство, когда необходимо дублировать объекты.Динамический полиморфизм не сразу работает с семантикой значений, потому что для использования динамического полиморфизма необходимо иметь дело с указателями или ссылками: при использовании значений статический тип и динамический тип объекта совпадают, что не допускает динамический полиморфизм напрямую.
В этом случае единственный способ иметь дело с динамически полиморфными объектами - это придать им внешний вид.По сути, это означает, что вам нужно инкапсулировать указатели на ваши объекты в объект, который предоставляет интерфейс требуемого значения (вы также можете инкапсулировать ссылки, если вы настаиваете, но я никогда не обнаруживал, что это работает хорошо).Библиотека Boost Graph на самом деле не заботится о том, как различные структуры внутренне представлены, если они имеют требуемый интерфейс и реализуют требуемую семантику.Из того, что вы описываете, использование оболочки для ваших указателей на полиморфные объекты - это правильный путь.Поддерживаете ли вы объект с помощью одного из стандартных интеллектуальных указателей или по-другому, на самом деле не имеет значения, хотя я предполагаю, что использование чего-то вроде boost::shared_ptr<T>
или std::shared_ptr<T>
устраняет ряд ненужных осложнений.
Все этоЯ хотел бы отметить, что я редко нахожу полезные примеры динамически полиморфных объектов в сочетании с алгоритмами!Да, есть некоторые, но в большинстве случаев использование динамического полиморфизма вносит свой вклад в проблему, а не в ее решение (несмотря на то, что говорят многие люди, обладающие только объектно-ориентированной техникой; однако, если единственный известный вам инструмент - молоток)каждая проблема выглядит как гвоздь).