Полиморфные объединенные свойства библиотеки графов Boost
-
29-10-2019 - |
Вопрос
Итак, я использую график ускорения следующего типа:
общийVertexT и EdgeT - это классы, которые сохраняют многие из необходимых мне свойств.Это связанные свойства.Я не уверен, возможны ли некоторые из способов, которыми я хочу использовать bgl, поэтому, если вы знакомы с ними, помощь будет очень признательна.
Предполагается, что VertexT и EdgeT являются полиморфными базовыми классами.Насколько я понимаю, bgl не предназначен для использования в качестве указателей на эти свойства.Как работать с полиморфными свойствами вершин и ребер с помощью BGL?Я думал об использовании общих указателей, но я бы предпочел сам управлять памятью.Кроме того, похоже, что это предотвращает проблему при использовании boost :: get для создания карты положения для макетов ускорения.
Прямо сейчас я решил обойти это, просто имея вершину, содержащую еще один указатель на настоящий полиморфный класс.Но это кажется слишком сложным.Есть предложения?
Решение
В общих реализациях алгоритмов предпочтительно использовать семантику значений: копирование объекта приводит к существованию двух идентичных объектов, которые являются независимыми. Это важнейшее свойство, когда необходимо дублировать объекты. Динамический полиморфизм не сразу работает с семантикой значений, потому что для использования динамического полиморфизма вам нужно иметь дело с указателями или ссылкой: при использовании значений статический тип и динамический тип объекта совпадают, что не допускает динамический полиморфизм напрямую.
Единственный способ справиться с объектами динамического полиморфизма в этом случае - придать им привлекательный внешний вид. Фактически это означает, что вам нужно инкапсулировать указатели на ваши объекты в объект, который предоставляет интерфейс требуемого значения (вы также можете инкапсулировать ссылки, если вы настаиваете, но я никогда не обнаружил, что это работает хорошо). Библиотека Boost Graph на самом деле не заботится о том, как различные структуры представлены внутри, если они имеют требуемый интерфейс и реализуют требуемую семантику. Исходя из того, что вы описываете, использование оболочки для указателей на полиморфные объекты - правильный путь. Поддерживаете ли вы объект с помощью одного из стандартных интеллектуальных указателей или иным образом, на самом деле не имеет значения, хотя я предполагаю, что использование чего-то вроде boost::shared_ptr<T>
или std::shared_ptr<T>
устраняет ряд ненужных сложностей.
С учетом всего сказанного, я хотел бы отметить, что я редко нахожу полезные примеры динамически полиморфных объектов в сочетании с алгоритмами! Да, есть некоторые, но в большинстве случаев использование динамического полиморфизма способствует решению проблемы, а не ее решению (несмотря на то, что говорят многие люди, знакомые только с объектно-ориентированной техникой; однако, если единственный известный вам инструмент - это молоток , каждая проблема похожа на гвоздь).
Другие советы
Я думаю, что вы в основном решаете ту же проблему, что и этот вопрос:
только для (объединенных) свойств.Я предлагаю вам выполнить полиморфизм, вызвав отдельные шаблоны функций.
Для реальной мощной техники: