// Copyright David Abrahams 2008. Distributed under the Boost // Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost/utility/enable_if.hpp" #include "boost/mpl/bool.hpp" namespace boost { template struct range_iterator { typedef typename T::iterator type; }; template struct range_iterator : range_iterator {}; } namespace my { struct range1 { range1() {} }; int* range_begin(range1 const& r) { return 0; } struct range2 { range2() {} typedef char* iterator; char* begin() const { return 0; } }; } namespace boost { template <> struct range_iterator { typedef int* type; }; } namespace boost { namespace range_detail { typedef char (&false_)[2]; typedef char true_; struct not_overloaded {}; not_overloaded operator,(not_overloaded,int); template not_overloaded range_begin(T const&); template true_ is_overloaded(T const&); false_ is_overloaded(not_overloaded); template T& make(); template struct range_begin_overloaded : mpl::bool_< (sizeof(range_detail::is_overloaded( (range_begin(make()),3) ))) == 1 > { }; } namespace begin_ { template typename lazy_disable_if, range_iterator >::type range_begin(R& r) { return r.begin(); } template typename lazy_disable_if, range_iterator >::type range_begin(R const& r) { return r.begin(); } template typename range_iterator::type begin(R& r) { return range_begin(r); } template typename range_iterator::type begin(R const& r) { return range_begin(r); } } using begin_::begin; }; namespace your { int* z0 = boost::begin(my::range1()); my::range1 x0; int* z1 = boost::begin(x0); my::range1 const x1; int* z2 = boost::begin(x1); char* w0 = boost::begin(my::range2()); my::range2 y0; char* w1 = boost::begin(y0); my::range2 const y1; char* w2 = boost::begin(y1); } int main() {}