
"David Abrahams" <dave@boost-consulting.com> wrote in message news:ur7pkurnp.fsf@boost-consulting.com... | "Thorsten Ottosen" <nesotto@cs.auc.dk> writes: | > 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) | } | | }} apart from the adl stuff, it already is like that. Did you mean to put in the range namespace to avoid problems with classes in boost? | Then you change the Range concept to require that | boost::range::begin(col) works. hm...yeah...one could perhaps state both syntaxes as part of the concept, eg Valid expressions ============ begin( a ) or a.begin() | Of course, Collection will only be a | refinement if there is no incorrect begin hanging around for that | type... so maybe this is fruitless. well, I agree that we have not got it complete right yet. perhaps the Range concept could specify Primary Template Behavior ================== return a.begin() ? And maybe we don't have to talk about collection as a refinement; maybe a new term is in order, like "act", sa in "all Collections may act as Ranges". -Thorsten, the confused