
Peter Dimov wrote:
David Abrahams wrote:
"Peter Dimov" <pdimov@mmltd.net> 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 R::const_iterator. 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 www.boost-consulting.com