Boost logo

Boost :

From: Eric Niebler (eric_at_[hidden])
Date: 2005-05-04 12:18:03

Peter Dimov wrote:
> David Abrahams wrote:
>> "Peter Dimov" <pdimov_at_[hidden]> writes:
>>> Thorsten Ottosen wrote:
>>>> I guess the design could havebeen that way; but we don't say
>>>> container< const T >::iterator to get container<T>::const_iterator.
>>> Isn't range_iterator<R>::type the iterator type of the range R?
>> Yes, in a world where iterator and const_iterator are distinguished.
>> [...]
> My question is to be read as follows:
> Is it not the design intent of range_iterator<R>::type to give the
> iterator type of the range R, so that I can write:
> template<class R> void f( R & r )
> {
> typename range_iterator<R>::type i = r.begin();
> }
> and hence, is it not perfectly logical for it to return
> C::const_iterator for R == C const?
> It was meant to support your point.

My understanding of the current design is that this is the purpose of
range_result_iterator, so I would rewrite your code as:

template<class R> void f( R & r )
    typename range_result_iterator<R>::type i = r.begin();

range_iterator always evaluates to R::iterator regardless of the
const-ness of R, and range_const_iterator always evaluates to

In my experience with Boost.Range, I have found range_result_iterator to
be useful. I have found little need for range_iterator and
range_const_iterator. YMMV.

Eric Niebler
Boost Consulting

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