Изменение комплексных свойств от посетителя
-
19-09-2019 - |
Вопрос
Как мне изменить комплексные свойства вершины изнутри посетителя?
Я хотел бы использовать простой метод подписания графика, но параметр графика, переданный в посетитель, является CONST, поэтому компилятор DEALLOWS изменяется.
Я могу сохранить ссылку на график в посетителе, но это кажется странным.
/**
A visitor which identifies vertices as leafs or trees
*/
class bfs_vis_leaf_finder:public default_bfs_visitor {
public:
/**
Constructor
@param[in] total reference to int variable to store total number of leaves
@param[in] g reference to graph ( used to modify bundled properties )
*/
bfs_vis_leaf_finder( int& total, graph_t& g ) :
myTotal( total ), myGraph( g )
{
myTotal = 0;
}
/**
Called when the search finds a new vertex
If the vertex has no children, it is a leaf and the total leaf count is incremented
*/
template <typename Vertex, typename Graph>
void discover_vertex( Vertex u, Graph& g)
{
if( out_edges( u, g ).first == out_edges( u, g ).second ) {
myTotal++;
//g[u].myLevel = s3d::cV::leaf;
myGraph[u].myLevel = s3d::cV::leaf;
} else {
//g[u].myLevel = s3d::cV::tree;
myGraph[u].myLevel = s3d::cV::tree;
}
}
int& myTotal;
graph_t& myGraph;
};
Решение
Ваше решение правильное.
Чтобы отделить тип графа от посетителя, вы можете передать только интересную карту свойств в конструктор для посетителей и получить доступ к его элементам, используя boost::get(property, u) = s3d::cV::leaf;
. Анкет Таким образом, вы можете передать любую собственность Vertex, совместимуе с типом, посетитель (посетитель будет более общим и не разумным для названия изменений в типе графика).
Тип для карты свойств станет именем типа шаблона для класса для посетителей и будет чем-то вроде:
typedef property_map<graph_t, s3d_cv3_leaf_t your_vertex_info::*>::type your_property_map;
Видеть здесь Для полной диссертации о комплексных свойствах.
Hth
Другие советы
Я просто изучаю это, но я думаю, что это правильно, что вы должны сохранить ссылку на график в посетителе. Я не уверен, что это по этой причине, но это может быть потому, что они не хотели предоставлять две версии всех функций/требуют производных для предоставления двух версий каждой функции. Особенно, когда доступен проход в графическом обходном пути.
Даже если это кажется странным, я думаю, что передача ссылки на график может быть «правильным способом».