2012-01-17 2 views
2

Поэтому я использую повышающий график следующего вида:Повысьте Graph Library Полиморфных Bundled Свойства

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

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

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

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

ответ

7

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

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

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

0

Я думаю, что вы, в основном решения той же задачи, как этот вопрос:

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


Для реальной высокой мощности машины:

Смотрите также в этой статье: On the Tension Between Object-Oriented and Generic Programming in C++; в этой статье описывается стирание стилей, которое является видом решения «все-все-все», чтобы развязать/свести к минимуму потребности в времени выполнения/статическом полиморфизме. (_ Обратите внимание, что библиотеки, такие как Boost Variant, Boost Any, гораздо удобнее, если вам нужно реализовать стирание стилей).