Что вы имеете в виду, вы не можете разделить вершины на подклассы? Вы можете использовать свой собственный класс вершин, просто укажите его в графе typedef. Вы даже можете использовать члены в качестве свойств при работе с алгоритмами BGL.
Что касается обратного (что сложнее IMO), вам нужно создать список свойств вершин и получить к нему доступ, используя дескриптор вершин ... Я думаю.
Редактировать: Вы определяете классы вершин / ребер при определении типа графа:
struct Vertex {
double some_property;
};
struct Edge {
double weight;
};
typedef boost::adjacency_list<
boost::listS, boost::vecS, boost::undirectedS, Vertex, Edge
> Graph; //sorry about the formatting
Graph g;
Откуда g [vertex_descriptor] должен возвращать ссылку на Vertex, например ::
//add 100 vertices
for (int i=0; i<100; ++i) {
Graph::vertex_descriptor v = add_vertex(g);
g[v].some_property = -1.0;
}
//zero some_property for all vertices
for (Graph::vertex_iterator i = vertices(g).first;
i != vertices(g).second;
++i)
{
g[*i].some_property = 0.0;
}
Я не смог найти код посетителя, использующий эти свойства, но нашел соответствующую часть документации BGL:
1) Часть о Внутренние свойства , которая рекомендует использовать вместо:
2) Комплектация
Вторая ссылка, похоже, имеет функцию Boost, использующую связанные свойства с использованием указателя на член.
Помогает ли это?