
"Thorsten Ottosen" <nesotto@cs.auc.dk> writes:
Dear all,
I'm going to change the ADL lookup hook of range functions.
instead of the irritating
void foo() { using namespace boost; begin(r); }
we simply now say
void foo() { boost::begin(r); }
and get full ADL lookup. This changes the extension protocol to overiding these three functions:
range_adl_begin() range_adl_end() range_adl_size()
Any comments before I commit?
[I hope we've dropped "adl_" from the name by now ;-) ] A scheme like this one has at least one advantage that we should be sure to take advantage of: it allows us to reduce the number of overloads required by conforming range classes. I've been working on a similar scheme for an generalized Range concept ("Sequence" -- I know it's used by the standard but how many suitable concept names remain?), so here's some of my code: ---- namespace boost { namespace sequence { // Do not use directly, except to specialize. // Default implementation works for ordinary STL sequences. template <class Sequence> struct traits { typedef typename Sequence::iterator begin_iterator; typedef typename Sequence::iterator end_iterator; typedef typename Sequence::const_iterator begin_const_iterator; typedef typename Sequence::const_iterator end_const_iterator; }; template <class Sequence> struct begin_iterator { typedef typename sequence::traits< Sequence >::begin_iterator type; }; // Note: this partial specialization is important! template <class Sequence> struct begin_iterator<Sequence const> { typedef typename sequence::traits< Sequence >::begin_const_iterator type; }; template <class Sequence> typename begin_const_iterator<Sequence>::type begin(Sequence const& s) { return sequence_begin(s); } template <class Sequence> typename begin_iterator<Sequence>::type begin(Sequence& s) { return sequence_begin(s); } }} namespace my { struct range; // Note: no overload for Range const&. This is never // called directly, so it always receives an lvalue. template <class Range> typename begin_iterator<Sequence>::type sequence_begin(Range& s) { return ... // whatever } ... } -- Dave Abrahams Boost Consulting www.boost-consulting.com