Boost logo

Boost :

Subject: Re: [boost] [graph] ranges used by boost.graph not compatible with c++11 range-based-for
From: Marshall Clow (mclow.lists_at_[hidden])
Date: 2013-10-03 10:08:28

On Oct 2, 2013, at 1:57 PM, Nathan Ridge <zeratul976_at_[hidden]> wrote:

>> I noticed today that code of this form does not compile:
>> typedef boost::adjacency_list<boost::vecS, boost::vecS,
>> boost::bidirectionalS, Node, Edge> Graph;
>> typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;
>> typedef boost::graph_traits<Graph>::edge_descriptor Edge;
>> Graph graph = ...;
>> Vertex vertex = ...;
>> for (Edge edge: boost::out_edges(vertex, graph)) {...}
>> The reason is that out_edges returns a std::pair of iterators. This
>> is a valid range in the sense of boost.range, and so is compatible
>> with BOOST_FOREACH. However, this is not a valid range in the sense
>> of c++11 range-based-for.
>> It's not clear whether this can easily be changed. In a perfect world
>> these functions should probably return something like
>> boost::iterator_range which would be compatible with both boost- and
>> language-level concepts of range-ness. However, the graph
>> documentation explicitly names the return types of out_edges et. al.
>> (see [1]) as std::pairs, which eliminates some wiggle room. Is there
>> an alternate way to address this?
> Sadly, I don't think there s a way of turn an std::pair of iterators into
> a range-based-for-compliant range (see [1]).
> So, I think that if Boost.Range wants to interoperate with standard
> ranges, it will need to deprecate std::pair of iterators as a range, and
> dependent libraries will need to follow suit.
> Regards,
> Nate
> [1]

Actually, it's pretty simple:

-- Marshall

Marshall Clow Idio Software <mailto:mclow.lists_at_[hidden]>

A.D. 1517: Martin Luther nails his 95 Theses to the church door and is promptly moderated down to (-1, Flamebait).
        -- Yu Suzuki

Boost list run by bdawes at, gregod at, cpdaniel at, john at