Boost Graph Library Полиморфные Связанные Свойства - PullRequest
3 голосов
/ 17 января 2012

Так что я использую график повышения следующего типа:

typedef boost::adjacency_list<boost::listS, boost::vecS, boost:directedS, VertexT, EdgeT> GraphT

VertexT и EdgeT - оба класса, чтобы сохранить многие свойства, которые мне нужны.Это связанные свойства.Я не уверен, возможны ли некоторые способы, которыми я хочу использовать bgl, поэтому, если вы знакомы с ними, помощь будет принята с благодарностью.

Предполагается, что VertexT и EdgeT являются полиморфными базовыми классами.Насколько я понимаю, bgl не предназначен для использования для указателей на эти свойства.Как работать с полиморфными свойствами вершин и ребер в BGL?Я думал об использовании общих указателей, но я бы предпочел сам управлять памятью.Кроме того, это, кажется, предотвращает проблему при использовании boost :: get для генерации карты положения для макетов наддува.

Прямо сейчас я взломал мой путь решения этой проблемы, просто установив в вершине другой указатель на истинный полиморфный класс.,Но это кажется слишком сложным.Есть предложения?

Ответы [ 2 ]

8 голосов
/ 22 января 2012

В общих реализациях алгоритмов предпочтительно использовать семантику значений: при копировании объекта существуют два идентичных объекта, которые являются независимыми.Это важное свойство, когда необходимо дублировать объекты.Динамический полиморфизм не сразу работает с семантикой значений, потому что для использования динамического полиморфизма необходимо иметь дело с указателями или ссылками: при использовании значений статический тип и динамический тип объекта совпадают, что не допускает динамический полиморфизм напрямую.

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

Все этоЯ хотел бы отметить, что я редко нахожу полезные примеры динамически полиморфных объектов в сочетании с алгоритмами!Да, есть некоторые, но в большинстве случаев использование динамического полиморфизма вносит свой вклад в проблему, а не в ее решение (несмотря на то, что говорят многие люди, обладающие только объектно-ориентированной техникой; однако, если единственный известный вам инструмент - молоток)каждая проблема выглядит как гвоздь).

1 голос
/ 19 января 2012

Я думаю, что вы в основном решаете ту же проблему, что и этот вопрос:

только для (в комплекте)) свойства.Я бы посоветовал вам сделать полиморфизм, вызвав отдельно стоящие шаблоны функций.


Для реальных мощных машин:

См. Также этот документ: О напряженности между объектно-ориентированным и общим программированием в C ++ ;в этой статье описывается стирание типов, которое является своего рода конечным «решением», позволяющим отделить / объединить ваши потребности во время выполнения / статический полиморфизм.(Обратите внимание, что библиотеки, такие как Boost Variant, Boost Any, намного удобнее, если вам нужно реализовать стирание типов).

...