1 // Boost.Range library 2 // 3 // Copyright Thorsten Ottosen 2003-2004. Use, modification and 4 // distribution is subject to the Boost Software License, Version 5 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at 6 // http://www.boost.org/LICENSE_1_0.txt) 7 // 8 // For more information, see http://www.boost.org/libs/range/ 9 // 10 11 #include <iostream> 12 13 namespace A 14 { 15 namespace detail 16 { 17 template< typename T > f(const T & x)18 int f( const T& x ) 19 { 20 // Default: 21 std::cout << 1 << std::endl; 22 return 1; 23 } 24 25 template< typename T > adl_f2(const T & x,int *)26 int adl_f2( const T& x, int* ) 27 { 28 return f( x ); 29 } 30 31 template< typename T > adl_f(const T & x)32 int adl_f( const T& x ) 33 { 34 return adl_f2( x, 0 ); 35 } 36 } 37 38 template< typename T > f(const T & x)39 int f( const T& x ) 40 { 41 return detail::adl_f( x ); 42 } 43 44 template< typename T > adl_f2(const T & x,int)45 int adl_f2( const T& x, int ) 46 { 47 return detail::f( x ); 48 } 49 50 //-------------------------------- 51 52 class C {}; 53 /* 54 // Optional: 55 int f( const C& x ) 56 { 57 std::cout << 2 << std::endl; 58 } 59 */ 60 template< typename T > 61 class D {}; 62 /* 63 // Optional: 64 template< typename T > 65 int f( const D< T >& x ) 66 { 67 std::cout << 3 << std::endl; 68 } 69 */ 70 } 71 72 73 namespace B 74 { 75 class C {}; 76 77 // Optional: 78 /* int f( const C& ) 79 { 80 std::cout << 4 << std::endl; 81 } 82 */ 83 template< typename T > 84 class D {}; 85 /* 86 // Optional: 87 template< typename T > 88 int f( const D< T >& x ) 89 { 90 std::cout << 5 << std::endl; 91 } 92 */ 93 } 94 main()95int main() 96 { 97 A::f( 42 ); 98 99 A::C ac; 100 A::f( ac ); 101 102 A::D< int > ad; 103 A::f( ad ); 104 105 B::C bc; 106 A::f( bc ); 107 108 B::D< int > bd; 109 A::f( bd ); 110 } 111