mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-30 12:30:23 -04:00 
			
		
		
		
	
		
			
	
	
		
			111 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			111 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | // Boost.Range library
 | ||
|  | //
 | ||
|  | //  Copyright Thorsten Ottosen 2003-2004. Use, modification and
 | ||
|  | //  distribution is subject to 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)
 | ||
|  | //
 | ||
|  | // For more information, see http://www.boost.org/libs/range/
 | ||
|  | //
 | ||
|  | 
 | ||
|  | #include <iostream>
 | ||
|  | 
 | ||
|  | namespace A | ||
|  | { | ||
|  |    namespace detail | ||
|  |    { | ||
|  |       template< typename T > | ||
|  |       int f( const T& x ) | ||
|  |       { | ||
|  |          // Default:
 | ||
|  |          std::cout << 1 << std::endl; | ||
|  |          return 1; | ||
|  |       } | ||
|  |     | ||
|  |       template< typename T > | ||
|  |       int adl_f2( const T& x, int* ) | ||
|  |       { | ||
|  |          return f( x ); | ||
|  |       } | ||
|  |     | ||
|  |       template< typename T > | ||
|  |       int adl_f( const T& x ) | ||
|  |       { | ||
|  |          return adl_f2( x, 0 ); | ||
|  |       } | ||
|  |    } | ||
|  | 
 | ||
|  |    template< typename T > | ||
|  |    int f( const T& x ) | ||
|  |    { | ||
|  |       return detail::adl_f( x ); | ||
|  |    } | ||
|  | 
 | ||
|  |    template< typename T > | ||
|  |    int adl_f2( const T& x, int ) | ||
|  |    { | ||
|  |       return detail::f( x ); | ||
|  |    } | ||
|  |     | ||
|  |    //--------------------------------
 | ||
|  |     | ||
|  |    class C {}; | ||
|  | /*
 | ||
|  |    // Optional:
 | ||
|  |    int f( const C& x ) | ||
|  |    { | ||
|  |       std::cout << 2 << std::endl; | ||
|  |    } | ||
|  | */ | ||
|  |    template< typename T > | ||
|  |    class D {}; | ||
|  | /*
 | ||
|  |    // Optional:
 | ||
|  |    template< typename T > | ||
|  |    int f( const D< T >& x ) | ||
|  |    { | ||
|  |       std::cout << 3 << std::endl; | ||
|  |    } | ||
|  |    */ | ||
|  | } | ||
|  | 
 | ||
|  |     | ||
|  | namespace B | ||
|  | { | ||
|  |    class C {}; | ||
|  | 
 | ||
|  |    // Optional:
 | ||
|  | /*   int f( const C& )
 | ||
|  |    { | ||
|  |       std::cout << 4 << std::endl; | ||
|  |    } | ||
|  | */ | ||
|  |    template< typename T > | ||
|  |    class D {}; | ||
|  | /*
 | ||
|  |    // Optional:
 | ||
|  |    template< typename T > | ||
|  |    int f( const D< T >& x ) | ||
|  |    { | ||
|  |       std::cout << 5 << std::endl; | ||
|  |    } | ||
|  |    */ | ||
|  | } | ||
|  | 
 | ||
|  | int main() | ||
|  | { | ||
|  |    A::f( 42 ); | ||
|  | 
 | ||
|  |    A::C ac; | ||
|  |    A::f( ac ); | ||
|  | 
 | ||
|  |    A::D< int > ad; | ||
|  |    A::f( ad ); | ||
|  | 
 | ||
|  |    B::C bc; | ||
|  |    A::f( bc ); | ||
|  | 
 | ||
|  |    B::D< int > bd; | ||
|  |    A::f( bd ); | ||
|  | } |