• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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()95 int 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