Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2004-09-02 19:23:22

"Thorsten Ottosen" <nesotto_at_[hidden]> writes:

> "Thorsten Ottosen" <nesotto_at_[hidden]> wrote in message
> news:ch7fj0$vbj$
> | "David Abrahams" <dave_at_[hidden]> wrote in message
> |
> | | > | Sounds like Collection is a refinement of Range.
> | | > well, I dropped the external/internal concept definitions in the
> | | > range docs, so currently ranges are defined by free-standing
> | | > functions and metafunctions and not members.
> | | If you have generalized free-standing functions/metafunctions that
> | | work for STL collections, they should work for the Collection
> | | concept too.
> | yes, of course. but that doesn't make a collection a refinement of a
> | range.
> Let me explain a little better this tricky situation. Since the Range
> concepts are described in terms of free-standing functions, we kind of
> loose the ability to say a class is a model of a Range concept if that
> class only has member functions in its interface.
> So since Collection has col.begin() and col.end() and not begin( col )
> and end( col ) it is not per se a model of any Range concept.
> Boost.Range then comes with an implementation of various Range
> concepts for *any* class that has begin() and end() members. So when
> this header with this implementation is included, all Collections
> model certain Range concepts; otherwise they do not.
> And since Ranges are complete decoupled from the class/member function
> idea, it does not make sense for classes to refine these concepts.
> hope it helps

What we need is somthing like this:

namespace boost { namespace range {

namespace detail
  template <class T>
  typename range_iterator<T>::type begin(T& x)
     return x.begin()
  template <class T>
  typename range_iterator<T>::type adl_begin(T& x)
      return begin(x); // will use ADL if a begin is defined

template <class T>
typename range_iterator<T>::type begin(T& x)
  return detail::adl_begin(x)


Then you change the Range concept to require that
boost::range::begin(col) works. Of course, Collection will only be a
refinement if there is no incorrect begin hanging around for that
type... so maybe this is fruitless.

Dave Abrahams
Boost Consulting

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