Изменение комплексных свойств от посетителя

StackOverflow https://stackoverflow.com/questions/1510945

  •  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

Другие советы

Я просто изучаю это, но я думаю, что это правильно, что вы должны сохранить ссылку на график в посетителе. Я не уверен, что это по этой причине, но это может быть потому, что они не хотели предоставлять две версии всех функций/требуют производных для предоставления двух версий каждой функции. Особенно, когда доступен проход в графическом обходном пути.

Даже если это кажется странным, я думаю, что передача ссылки на график может быть «правильным способом».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top