mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-31 04:50:34 -04:00 
			
		
		
		
	
		
			
	
	
		
			87 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			87 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|  | //  Copyright (c) 2000 | ||
|  | //  Cadenza New Zealand Ltd | ||
|  | // | ||
|  | //  (C) Copyright John Maddock 2001.  | ||
|  | // | ||
|  | //  Use, modification and distribution are 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) | ||
|  | 
 | ||
|  | //  See http://www.boost.org/libs/config for the most recent version. | ||
|  | 
 | ||
|  | //  MACRO:         BOOST_NO_POINTER_TO_MEMBER_CONST | ||
|  | //  TITLE:         pointers to const member functions | ||
|  | //  DESCRIPTION:   The compiler does not correctly handle | ||
|  | //                 pointers to const member functions, preventing use | ||
|  | //                 of these in overloaded function templates. | ||
|  | //                 See boost/functional.hpp for example. | ||
|  | 
 | ||
|  | #include <functional> | ||
|  | 
 | ||
|  | namespace boost_no_pointer_to_member_const{ | ||
|  | 
 | ||
|  | template <class S, class T> | ||
|  | class const_mem_fun_t : public std::unary_function<const T*, S> | ||
|  | { | ||
|  | public: | ||
|  |   explicit const_mem_fun_t(S (T::*p)() const) | ||
|  |       : | ||
|  |       ptr(p) | ||
|  |   {} | ||
|  |   S operator()(const T* p) const | ||
|  |   { | ||
|  |       return (p->*ptr)(); | ||
|  |   } | ||
|  | private: | ||
|  |   S (T::*ptr)() const;         | ||
|  | }; | ||
|  | 
 | ||
|  | template <class S, class T, class A> | ||
|  | class const_mem_fun1_t : public std::binary_function<const T*, A, S> | ||
|  | { | ||
|  | public: | ||
|  |   explicit const_mem_fun1_t(S (T::*p)(A) const) | ||
|  |       : | ||
|  |       ptr(p) | ||
|  |   {} | ||
|  |   S operator()(const T* p, const A& x) const | ||
|  |   { | ||
|  |       return (p->*ptr)(x); | ||
|  |   } | ||
|  | private: | ||
|  |   S (T::*ptr)(A) const; | ||
|  | }; | ||
|  | 
 | ||
|  | template<class S, class T> | ||
|  | inline const_mem_fun_t<S,T> mem_fun(S (T::*f)() const) | ||
|  | { | ||
|  |   return const_mem_fun_t<S,T>(f); | ||
|  | } | ||
|  | 
 | ||
|  | template<class S, class T, class A> | ||
|  | inline const_mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A) const) | ||
|  | { | ||
|  |   return const_mem_fun1_t<S,T,A>(f); | ||
|  | } | ||
|  | 
 | ||
|  | class tester | ||
|  | { | ||
|  | public: | ||
|  |    void foo1()const{} | ||
|  |    int foo2(int i)const{ return i*2; } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | int test() | ||
|  | { | ||
|  |    boost_no_pointer_to_member_const::mem_fun(&tester::foo1); | ||
|  |    boost_no_pointer_to_member_const::mem_fun(&tester::foo2); | ||
|  |    return 0; | ||
|  | } | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 |