diff --git a/include/boost/bind.hpp b/include/boost/bind.hpp index 3324bcf..849ed9a 100644 --- a/include/boost/bind.hpp +++ b/include/boost/bind.hpp @@ -1564,71 +1564,59 @@ _bi::bind_t< R, _mfi::dm, typename _bi::list_av_1::type > namespace _bi { -#if defined(__GNUC__) && (__GNUC__ == 2) +template< class Pm, int I > struct add_cref; -template struct add_cref -{ - typedef T const & type; -}; - -template struct add_cref< T & > -{ - typedef T const & type; -}; - -template<> struct add_cref< void > -{ - typedef void type; -}; - -#endif - -template struct dm_result +template< class M, class T > struct add_cref< M T::*, 0 > { typedef M type; }; -template struct dm_result< M, R& > +template< class M, class T > struct add_cref< M T::*, 1 > { typedef M const & type; }; +template< class R, class T > struct add_cref< R (T::*) (), 1 > +{ + typedef void type; +}; + +template< class R, class T > struct add_cref< R (T::*) () const, 1 > +{ + typedef void type; +}; + +template struct dm_result +{ + typedef typename add_cref< Pm, 1 >::type type; +}; + +template struct dm_result< Pm, bind_t > +{ + typedef typename add_cref< Pm, 0 >::type type; +}; + +template struct dm_result< Pm, bind_t > +{ + typedef typename add_cref< Pm, 1 >::type type; +}; + } // namespace _bi -#if defined(__GNUC__) && (__GNUC__ == 2) +template< class A1, class M, class T > -template -_bi::bind_t< typename _bi::add_cref::type, _mfi::dm, typename _bi::list_av_1::type > - BOOST_BIND( M T::*f, A1 a1 ) +_bi::bind_t< + typename _bi::dm_result< M T::*, A1 >::type, + _mfi::dm, + typename _bi::list_av_1::type +> + +BOOST_BIND( M T::*f, A1 a1 ) { - typedef typename _bi::add_cref::type result_type; + typedef typename _bi::dm_result< M T::*, A1 >::type result_type; typedef _mfi::dm F; typedef typename _bi::list_av_1::type list_type; - return _bi::bind_t(F(f), list_type(a1)); -} - -#else - -template -_bi::bind_t< M const &, _mfi::dm, typename _bi::list_av_1::type > - BOOST_BIND( M T::*f, A1 a1 ) -{ - typedef M const & result_type; - typedef _mfi::dm F; - typedef typename _bi::list_av_1::type list_type; - return _bi::bind_t(F(f), list_type(a1)); -} - -#endif - -template -_bi::bind_t< typename _bi::dm_result::type, _mfi::dm, typename _bi::list_av_1< _bi::bind_t >::type > - BOOST_BIND( M T::*f, _bi::bind_t a1 ) -{ - typedef typename _bi::dm_result::type result_type; - typedef typename _bi::list_av_1< _bi::bind_t >::type list_type; - typedef _mfi::dm F; - return _bi::bind_t< result_type, F, list_type >( F(f), list_type(a1) ); + return _bi::bind_t< result_type, F, list_type >( F( f ), list_type( a1 ) ); } #endif