Я (успешно) реализовал пользовательский посетитель для моей BFS:
(См. Также: Найдите все достижимые вершины в графике Boost BGL, используя 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..........
Мой вопрос:
- Можно ли использовать make_bfs_visitor с алгоритмом breadth_first_visit?Все примеры, которые я нашел, реализованы с помощью breadth_first_search!
- Может ли это (один или несколько посетителей, например exam_edge, exam_vertex) быть реализовано даже с использованием лямбда-выражений?
- Существуют ли какие-либо причины (например, снижение производительности) использовать одно решение за другим?