From d28a5cc23a5af0007651873d1b1c4f513f9ff8a7 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Thu, 3 Nov 2005 23:04:18 +0000 Subject: [PATCH] Data members now return a reference... sometimes. [SVN r31550] --- include/boost/bind.hpp | 70 +++++++++++++++++++++++++++++------------- 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/include/boost/bind.hpp b/include/boost/bind.hpp index 2b89c13..3324bcf 100644 --- a/include/boost/bind.hpp +++ b/include/boost/bind.hpp @@ -1548,13 +1548,24 @@ template +_bi::bind_t< R, _mfi::dm, typename _bi::list_av_1::type > + BOOST_BIND(R T::*f, A1 a1) +{ + typedef _mfi::dm F; + typedef typename _bi::list_av_1::type list_type; + return _bi::bind_t( F(f), list_type(a1) ); +} + +#else namespace _bi { +#if defined(__GNUC__) && (__GNUC__ == 2) + template struct add_cref { typedef T const & type; @@ -1565,46 +1576,63 @@ template struct add_cref< T & > typedef T const & type; }; -template<> struct add_cref +template<> struct add_cref< void > { typedef void type; }; +#endif + +template struct dm_result +{ + typedef M type; +}; + +template struct dm_result< M, R& > +{ + typedef M const & type; +}; + } // namespace _bi -template -_bi::bind_t< typename _bi::add_cref::type, _mfi::dm, typename _bi::list_av_1::type > - BOOST_BIND(R T::*f, A1 a1) +#if defined(__GNUC__) && (__GNUC__ == 2) + +template +_bi::bind_t< typename _bi::add_cref::type, _mfi::dm, typename _bi::list_av_1::type > + BOOST_BIND( M T::*f, A1 a1 ) { - typedef _mfi::dm F; + typedef typename _bi::add_cref::type result_type; + typedef _mfi::dm F; typedef typename _bi::list_av_1::type list_type; - return _bi::bind_t::type, F, list_type>(F(f), list_type(a1)); + return _bi::bind_t(F(f), list_type(a1)); } #else -template -_bi::bind_t< R const &, _mfi::dm, typename _bi::list_av_1::type > - BOOST_BIND(R T::*f, A1 a1) +template +_bi::bind_t< M const &, _mfi::dm, typename _bi::list_av_1::type > + BOOST_BIND( M T::*f, A1 a1 ) { - typedef _mfi::dm F; + 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)); + return _bi::bind_t(F(f), list_type(a1)); } #endif -*/ - -template -_bi::bind_t< R, _mfi::dm, typename _bi::list_av_1::type > - BOOST_BIND(R T::*f, A1 a1) +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 _mfi::dm F; - typedef typename _bi::list_av_1::type list_type; - return _bi::bind_t( F(f), list_type(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) ); } +#endif + } // namespace boost #ifndef BOOST_BIND_NO_PLACEHOLDERS