在boost BGL中使用make_bfs_visitor代替具有BFS的派生访客

时间:2018-12-22 17:08:44

标签: c++ boost graph boost-graph

我(成功地)为BFS实现了自定义访问者:

(另请参见:Find all reachable vertices in a Boost BGL graph using BFS

...
...
ListVisitor vis;
boost::breadth_first_visit(mListGraph, start, Q, vis, colormap);

在我的头文件中定义的访问者:

class ListVisitor : public boost::default_bfs_visitor
{
public:
    template <typename Vertex, typename Graph>
    void discover_vertex(Vertex u, const Graph& /*g*/) const
    {
        std::cout << u << std::endl;
    }
};

这可以按预期工作...所以一切都很好。 :-)

但是我想更改代码以改为使用make_bfs_visitor
并像这样更改我的代码:

boost::breadth_first_visit(mListGraph, start, Q,
    boost::visitor(
        boost::make_bfs_visitor(
                ListVisitor<boost::on_discover_vertex>()
        )
    ), colormap);

和.h中:

template <typename event_type>
struct ListVisitor : public boost::default_bfs_visitor
{
    using event_filter = event_type;

    template<typename GRAPH>
    void operator()(GRAPH::vertex_descriptor vert, const GRAPH& graph) const
    {
        std::cout << u << std::endl;
    }
};

不幸的是,这会产生错误:

Error   C2061   syntax error: identifier 'vertex_descriptor'

我还尝试使用实型而不是模板化类型:

void operator()(ListGraph_t::vertex_descriptor vert, const ListGraph_t& graph) const

但它只会更改错误:

Error   C2039   'discover_vertex': is not a member of ...  
Error   C2039   'examine_vertex': is not a member of ...  
Error   C2039   'examine_edge': is not a member of ...  
and so on..........  

我的问题:

  1. 是否可以将make_bfs_visitor与breadth_first_visit算法一起使用? 我发现的所有示例都是用Breadth_first_search实现的!
  2. 是否可以使用lambda表达式来实现此功能(一个或多个来访者,如inspect_edge,expect_vertex)?
  3. 使用其他解决方案是否有任何原因(例如,性能下降)?

1 个答案:

答案 0 :(得分:1)

您需要使用KAFKA -> PROCESS(STORE IN DB) -> KAFKA来指示typename中的vertex_descriptor是一种类型:

GRAPH

Boost有一个不错的库template<typename GRAPH> void operator()(typename GRAPH::vertex_descriptor vert, const GRAPH& graph) const ^^^^^^^^ { std::cout << u << std::endl; } ,我用它来打印两种类型:

type_index.hpp

输出为

auto v = boost::make_bfs_visitor(ListVisitor<boost::on_discover_vertex>());
cout << boost::typeindex::type_id_with_cvr<decltype(v)>().pretty_name() << endl;

boost::bfs_visitor<ListVisitor<boost::on_discover_vertex> > 具有bfs_visitordiscover_vertex等方法。

现在,我们打印您的访问者的类型:

examine_vertex

作为输出

auto v2 = 
boost::visitor(boost::make_bfs_visitor(ListVisitor<boost::on_discover_vertex>()));
       ^^^            ^^^
cout << boost::typeindex::type_id_with_cvr<decltype(v2)>().pretty_name() << endl;

这就是为什么编译器会抱怨boost::bgl_named_params<boost::bfs_visitor<ListVisitor<boost::on_discover_vertex> >, boost::graph_visitor_t, boost::no_property> 不是X的成员。

因此您需要致电

bgl_named_params

这两个更改之后,您的代码可以正常编译。