Boost logo

Boost Users :

Subject: Re: [Boost-users] [BGL] vis passed by value to depth_first_visit
From: Jeremiah Willcock (jewillco_at_[hidden])
Date: 2011-04-20 16:07:16

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<TopoVisitor<...> >' 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

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at