
Hi, I recently learned the hard way that the visitor parameter, vis, is passed by value to depth_first_visit, but passed by reference to detail::depth_first_visit_impl. I was writing a function that implemented depth_first_search, but starts each of the visits at vertices with indegree == 0. If my depth_first_search replacement calls boost::depth_first_visit, each call to depth_first_visit makes a copy of the output iterator, which doesn't work for an output iterator with any state (such as a pointer). Calling an internal boost function like detail::depth_first_visit_impl doesn't seem like a good plan. How should I solve this? My short-term work around is to use an output iterator that does not have any state, such as a back_inserter. Cheers, Shaun

On Tue, 19 Apr 2011, Shaun Jackman wrote:
Hi,
I recently learned the hard way that the visitor parameter, vis, is passed by value to depth_first_visit, but passed by reference to detail::depth_first_visit_impl.
I was writing a function that implemented depth_first_search, but starts each of the visits at vertices with indegree == 0. If my depth_first_search replacement calls boost::depth_first_visit, each call to depth_first_visit makes a copy of the output iterator, which doesn't work for an output iterator with any state (such as a pointer).
Calling an internal boost function like detail::depth_first_visit_impl doesn't seem like a good plan. How should I solve this?
My short-term work around is to use an output iterator that does not have any state, such as a back_inserter.
Does passing in boost::ref(vis) work? Otherwise, have your visitor keep a reference to the state that should be modified outside the visitor (copying a reference just leads to another reference to the same object). -- Jeremiah Willcock

On Wed, 2011-04-20 at 10:13 -0700, Jeremiah Willcock wrote:
On Tue, 19 Apr 2011, Shaun Jackman wrote:
Hi,
I recently learned the hard way that the visitor parameter, vis, is passed by value to depth_first_visit, but passed by reference to detail::depth_first_visit_impl.
I was writing a function that implemented depth_first_search, but starts each of the visits at vertices with indegree == 0. If my depth_first_search replacement calls boost::depth_first_visit, each call to depth_first_visit makes a copy of the output iterator, which doesn't work for an output iterator with any state (such as a pointer).
Calling an internal boost function like detail::depth_first_visit_impl doesn't seem like a good plan. How should I solve this?
My short-term work around is to use an output iterator that does not have any state, such as a back_inserter.
Does passing in boost::ref(vis) work? Otherwise, have your visitor keep a reference to the state that should be modified outside the visitor (copying a reference just leads to another reference to the same object).
-- Jeremiah Willcock
Hi Jeremiah,
Using boost:ref does not seem to work. It gives the error:
../../boost/graph/depth_first_search.hpp:311:
error: 'class boost::reference_wrapper

On Wed, 20 Apr 2011, Shaun Jackman wrote:
On Wed, 2011-04-20 at 10:13 -0700, Jeremiah Willcock wrote:
On Tue, 19 Apr 2011, Shaun Jackman wrote:
Hi,
I recently learned the hard way that the visitor parameter, vis, is passed by value to depth_first_visit, but passed by reference to detail::depth_first_visit_impl.
I was writing a function that implemented depth_first_search, but starts each of the visits at vertices with indegree == 0. If my depth_first_search replacement calls boost::depth_first_visit, each call to depth_first_visit makes a copy of the output iterator, which doesn't work for an output iterator with any state (such as a pointer).
Calling an internal boost function like detail::depth_first_visit_impl doesn't seem like a good plan. How should I solve this?
My short-term work around is to use an output iterator that does not have any state, such as a back_inserter.
Does passing in boost::ref(vis) work? Otherwise, have your visitor keep a reference to the state that should be modified outside the visitor (copying a reference just leads to another reference to the same object).
-- Jeremiah Willcock
Hi Jeremiah,
Using boost:ref does not seem to work. It gives the error:
../../boost/graph/depth_first_search.hpp:311: error: 'class boost::reference_wrapper
>' has no member named 'start_vertex' (where the elision ... is my own) The expression vis.start_vertex(u) does not seem to be valid when vis is a reference_wrapper. Can boost:ref be coerced to work in this situation?
Probably not, at least not easily. I would just have your visitor keep references to the things that shouldn't be copied. -- Jeremiah Willcock
participants (2)
-
Jeremiah Willcock
-
Shaun Jackman