| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737 | // Boost Lambda Library -- member_ptr.hpp ---------------------// Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)// Copyright (C) 2000 Gary Powell (gary.powell@sierra.com)//// Distributed under 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 www.boost.org// --------------------------------------------------------------------------#if !defined(BOOST_LAMBDA_MEMBER_PTR_HPP)#define BOOST_LAMBDA_MEMBER_PTR_HPPnamespace boost { namespace lambda {class member_pointer_action {};namespace detail {// the boost type_traits member_pointer traits are not enough, // need to know more details.template<class T>struct member_pointer {  typedef typename boost::add_reference<T>::type type;  typedef detail::unspecified class_type;  typedef detail::unspecified qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = false);};template<class T, class U>struct member_pointer<T U::*> {  typedef typename boost::add_reference<T>::type type;  typedef U class_type;  typedef U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = true);  BOOST_STATIC_CONSTANT(bool, is_function_member = false);};template<class T, class U>struct member_pointer<const T U::*> {  typedef typename boost::add_reference<const T>::type type;  typedef U class_type;  typedef const U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = true);  BOOST_STATIC_CONSTANT(bool, is_function_member = false);};template<class T, class U>struct member_pointer<volatile T U::*> {  typedef typename boost::add_reference<volatile T>::type type;  typedef U class_type;  typedef volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = true);  BOOST_STATIC_CONSTANT(bool, is_function_member = false);};template<class T, class U>struct member_pointer<const volatile T U::*> {  typedef typename boost::add_reference<const volatile T>::type type;  typedef U class_type;  typedef const volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = true);  BOOST_STATIC_CONSTANT(bool, is_function_member = false);};// -- nonconst member functions --template<class T, class U>struct member_pointer<T (U::*)()> {  typedef T type;  typedef U class_type;  typedef U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1>struct member_pointer<T (U::*)(A1)> {  typedef T type;  typedef U class_type;  typedef U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2>struct member_pointer<T (U::*)(A1, A2)> {  typedef T type;  typedef U class_type;  typedef U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3>struct member_pointer<T (U::*)(A1, A2, A3)> {  typedef T type;  typedef U class_type;  typedef U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4>struct member_pointer<T (U::*)(A1, A2, A3, A4)> {  typedef T type;  typedef U class_type;  typedef U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5)> {  typedef T type;  typedef U class_type;  typedef U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5,         class A6>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6)> {  typedef T type;  typedef U class_type;  typedef U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5,         class A6, class A7>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7)> {  typedef T type;  typedef U class_type;  typedef U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5,         class A6, class A7, class A8>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8)> {  typedef T type;  typedef U class_type;  typedef U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5,         class A6, class A7, class A8, class A9>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9)> {  typedef T type;  typedef U class_type;  typedef U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};// -- const member functions --template<class T, class U>struct member_pointer<T (U::*)() const> {  typedef T type;  typedef U class_type;  typedef const U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1>struct member_pointer<T (U::*)(A1) const> {  typedef T type;  typedef U class_type;  typedef const U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2>struct member_pointer<T (U::*)(A1, A2) const> {  typedef T type;  typedef U class_type;  typedef const U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3>struct member_pointer<T (U::*)(A1, A2, A3) const> {  typedef T type;  typedef U class_type;  typedef const U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4>struct member_pointer<T (U::*)(A1, A2, A3, A4) const> {  typedef T type;  typedef U class_type;  typedef const U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5) const> {  typedef T type;  typedef U class_type;  typedef const U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5,         class A6>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6) const> {  typedef T type;  typedef U class_type;  typedef const U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5,         class A6, class A7>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7) const> {  typedef T type;  typedef U class_type;  typedef const U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5,         class A6, class A7, class A8>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8) const> {  typedef T type;  typedef U class_type;  typedef const U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5,         class A6, class A7, class A8, class A9>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9) const> {  typedef T type;  typedef U class_type;  typedef const U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};  // -- volatile --template<class T, class U>struct member_pointer<T (U::*)() volatile> {  typedef T type;  typedef U class_type;  typedef volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1>struct member_pointer<T (U::*)(A1) volatile> {  typedef T type;  typedef U class_type;  typedef volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2>struct member_pointer<T (U::*)(A1, A2) volatile> {  typedef T type;  typedef U class_type;  typedef volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3>struct member_pointer<T (U::*)(A1, A2, A3) volatile> {  typedef T type;  typedef U class_type;  typedef volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4>struct member_pointer<T (U::*)(A1, A2, A3, A4) volatile> {  typedef T type;  typedef U class_type;  typedef volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5) volatile> {  typedef T type;  typedef U class_type;  typedef volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5,         class A6>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6) volatile> {  typedef T type;  typedef U class_type;  typedef volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5,         class A6, class A7>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7) volatile> {  typedef T type;  typedef U class_type;  typedef volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5,         class A6, class A7, class A8>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8) volatile> {  typedef T type;  typedef U class_type;  typedef volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5,         class A6, class A7, class A8, class A9>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9) volatile> {  typedef T type;  typedef U class_type;  typedef volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};  // -- const volatiletemplate<class T, class U>struct member_pointer<T (U::*)() const volatile> {  typedef T type;  typedef U class_type;  typedef const volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1>struct member_pointer<T (U::*)(A1) const volatile> {  typedef T type;  typedef U class_type;  typedef const volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2>struct member_pointer<T (U::*)(A1, A2) const volatile> {  typedef T type;  typedef U class_type;  typedef const volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3>struct member_pointer<T (U::*)(A1, A2, A3) const volatile> {  typedef T type;  typedef U class_type;  typedef const volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4>struct member_pointer<T (U::*)(A1, A2, A3, A4) const volatile> {  typedef T type;  typedef U class_type;  typedef const volatile U qualified_class_type;};template<class T, class U, class A1, class A2, class A3, class A4, class A5>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5) const volatile> {  typedef T type;  typedef U class_type;  typedef const volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5,         class A6>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6) const volatile> {  typedef T type;  typedef U class_type;  typedef const volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5,         class A6, class A7>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7) const volatile> {  typedef T type;  typedef U class_type;  typedef const volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5,         class A6, class A7, class A8>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8) const volatile> {  typedef T type;  typedef U class_type;  typedef const volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};template<class T, class U, class A1, class A2, class A3, class A4, class A5,         class A6, class A7, class A8, class A9>struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9) const volatile> {  typedef T type;  typedef U class_type;  typedef const volatile U qualified_class_type;  BOOST_STATIC_CONSTANT(bool, is_data_member = false);  BOOST_STATIC_CONSTANT(bool, is_function_member = true);};} // detailnamespace detail {  // this class holds a pointer to a member function and the object.  // when called, it just calls the member function with the parameters   // provided  // It would have been possible to use existing lambda_functors to represent  // a bound member function like this, but to have a separate template is   // safer, since now this functor doesn't mix and match with lambda_functors  // only thing you can do with this is to call it  // note that previously instantiated classes   // (other_action<member_pointer_action> and member_pointer_action_helper  // guarantee, that A and B are   // such types, that for objects a and b of corresponding types, a->*b leads   // to the builtin ->* to be called. So types that would end in a  call to   // a user defined ->* do not create a member_pointer_caller object.template<class RET, class A, class B>class member_pointer_caller {  A a; B b;public:  member_pointer_caller(const A& aa, const B& bb) : a(aa), b(bb) {}  RET operator()() const { return (a->*b)(); }   template<class A1>  RET operator()(const A1& a1) const { return (a->*b)(a1); }   template<class A1, class A2>  RET operator()(const A1& a1, const A2& a2) const { return (a->*b)(a1, a2); }   template<class A1, class A2, class A3>  RET operator()(const A1& a1, const A2& a2, const A3& a3) const {     return (a->*b)(a1, a2, a3);   }   template<class A1, class A2, class A3, class A4>  RET operator()(const A1& a1, const A2& a2, const A3& a3,                  const A4& a4) const {     return (a->*b)(a1, a2, a3, a4);   }   template<class A1, class A2, class A3, class A4, class A5>  RET operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4,                  const A5& a5) const {     return (a->*b)(a1, a2, a3, a4, a5);   }   template<class A1, class A2, class A3, class A4, class A5, class A6>  RET operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4,                  const A5& a5, const A6& a6) const {     return (a->*b)(a1, a2, a3, a4, a5, a6);   }   template<class A1, class A2, class A3, class A4, class A5, class A6,            class A7>  RET operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4,                  const A5& a5, const A6& a6, const A7& a7) const {     return (a->*b)(a1, a2, a3, a4, a5, a6, a7);   }   template<class A1, class A2, class A3, class A4, class A5, class A6,            class A7, class A8>  RET operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4,                  const A5& a5, const A6& a6, const A7& a7,                 const A8& a8) const {     return (a->*b)(a1, a2, a3, a4, a5, a6, a7, a8);   }   template<class A1, class A2, class A3, class A4, class A5, class A6,            class A7, class A8, class A9>  RET operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4,                  const A5& a5, const A6& a6, const A7& a7,                 const A8& a8, const A9& a9) const {     return (a->*b)(a1, a2, a3, a4, a5, a6, a7, a8, a9);   } };// helper templates for return type deduction and action classes// different cases for data member, function member, neither// true-true casetemplate <bool Is_data_member, bool Is_function_member>struct member_pointer_action_helper;  // cannot be both, no body provided  // data member case  // this means, that B is a data member and A is a pointer type,  // so either built-in ->* should be called, or there is an errortemplate <>struct member_pointer_action_helper<true, false> {public:  template<class RET, class A, class B>  static RET apply(A& a, B& b) {     return a->*b;   }  template<class A, class B>  struct return_type {  private:    typedef typename detail::remove_reference_and_cv<B>::type plainB;    typedef typename detail::member_pointer<plainB>::type type0;    // we remove the reference now, as we may have to add cv:s     typedef typename boost::remove_reference<type0>::type type1;    // A is a reference to pointer    // remove the top level cv qualifiers and reference    typedef typename       detail::remove_reference_and_cv<A>::type non_ref_A;    // A is a pointer type, so take the type pointed to    typedef typename ::boost::remove_pointer<non_ref_A>::type non_pointer_A;   public:    // For non-reference types, we must add const and/or volatile if    // the pointer type has these qualifiers    // If the member is a reference, these do not have any effect    //   (cv T == T if T is a reference type)    typedef typename detail::IF<      ::boost::is_const<non_pointer_A>::value,       typename ::boost::add_const<type1>::type,      type1    >::RET type2;    typedef typename detail::IF<      ::boost::is_volatile<non_pointer_A>::value,       typename ::boost::add_volatile<type2>::type,      type2    >::RET type3;    // add reference back    typedef typename ::boost::add_reference<type3>::type type;  };};  // neither casetemplate <>struct member_pointer_action_helper<false, false> {public:  template<class RET, class A, class B>  static RET apply(A& a, B& b) { // not a built in member pointer operator, just call ->*    return a->*b;   }  // an overloaded member pointer operators, user should have specified  // the return type  // At this point we know that there is no matching specialization for  // return_type_2, so try return_type_2_plain  template<class A, class B>  struct return_type {    typedef typename plain_return_type_2<      other_action<member_pointer_action>, A, B    >::type type;  };  };// member pointer function case// This is a built in ->* call for a member function, // the only thing that you can do with that, is to give it some arguments// note, it is guaranteed that A is a pointer type, and thus it cannot// be a call to overloaded ->*template <>struct member_pointer_action_helper<false, true> {  public:  template<class RET, class A, class B>  static RET apply(A& a, B& b) {     typedef typename ::boost::remove_cv<B>::type plainB;    typedef typename detail::member_pointer<plainB>::type ret_t;     typedef typename ::boost::remove_cv<A>::type plainA;    // we always strip cv:s to     // make the two routes (calling and type deduction)    // to give the same results (and the const does not make any functional    // difference)    return detail::member_pointer_caller<ret_t, plainA, plainB>(a, b);   }  template<class A, class B>  struct return_type {    typedef typename detail::remove_reference_and_cv<B>::type plainB;    typedef typename detail::member_pointer<plainB>::type ret_t;     typedef typename detail::remove_reference_and_cv<A>::type plainA;     typedef detail::member_pointer_caller<ret_t, plainA, plainB> type;   };};} // detailtemplate<> class other_action<member_pointer_action>  {public:  template<class RET, class A, class B>  static RET apply(A& a, B& b) {    typedef typename       ::boost::remove_cv<B>::type plainB;    return detail::member_pointer_action_helper<        boost::is_pointer<A>::value &&           detail::member_pointer<plainB>::is_data_member,        boost::is_pointer<A>::value &&           detail::member_pointer<plainB>::is_function_member      >::template apply<RET>(a, b);     }};  // return type deduction --  // If the right argument is a pointer to data member,   // and the left argument is of compatible pointer to class type  // return type is a reference to the data member type  // if right argument is a pointer to a member function, and the left   // argument is of a compatible type, the return type is a   // member_pointer_caller (see above)  // Otherwise, return type deduction fails. There is either an error,   // or the user is trying to call an overloaded ->*  // In such a case either ret<> must be used, or a return_type_2 user   // defined specialization must be providedtemplate<class A, class B>struct return_type_2<other_action<member_pointer_action>, A, B> {private:  typedef typename     detail::remove_reference_and_cv<B>::type plainB;public:  typedef typename     detail::member_pointer_action_helper<      detail::member_pointer<plainB>::is_data_member,      detail::member_pointer<plainB>::is_function_member    >::template return_type<A, B>::type type; };  // this is the way the generic lambda_functor_base functions instantiate  // return type deduction. We turn it into return_type_2, so that the   // user can provide specializations on that level.template<class Args>struct return_type_N<other_action<member_pointer_action>, Args> {  typedef typename boost::tuples::element<0, Args>::type A;  typedef typename boost::tuples::element<1, Args>::type B;  typedef typename     return_type_2<other_action<member_pointer_action>,                   typename boost::remove_reference<A>::type,                   typename boost::remove_reference<B>::type                 >::type type;};template<class Arg1, class Arg2>inline constlambda_functor<  lambda_functor_base<    action<2, other_action<member_pointer_action> >,    tuple<lambda_functor<Arg1>, typename const_copy_argument<Arg2>::type>  >>operator->*(const lambda_functor<Arg1>& a1, const Arg2& a2){  return       lambda_functor_base<        action<2, other_action<member_pointer_action> >,        tuple<lambda_functor<Arg1>, typename const_copy_argument<Arg2>::type>      >      (tuple<lambda_functor<Arg1>,              typename const_copy_argument<Arg2>::type>(a1, a2));}template<class Arg1, class Arg2>inline constlambda_functor<  lambda_functor_base<    action<2, other_action<member_pointer_action> >,    tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >  >>operator->*(const lambda_functor<Arg1>& a1, const lambda_functor<Arg2>& a2){  return       lambda_functor_base<        action<2, other_action<member_pointer_action> >,        tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >      >    (tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >(a1, a2));}template<class Arg1, class Arg2>inline constlambda_functor<  lambda_functor_base<    action<2, other_action<member_pointer_action> >,    tuple<typename const_copy_argument<Arg1>::type, lambda_functor<Arg2> >  >>operator->*(const Arg1& a1, const lambda_functor<Arg2>& a2){  return       lambda_functor_base<        action<2, other_action<member_pointer_action> >,        tuple<typename const_copy_argument<Arg1>::type, lambda_functor<Arg2> >      >      (tuple<typename const_copy_argument<Arg1>::type,              lambda_functor<Arg2> >(a1, a2));}} // namespace lambda } // namespace boost#endif
 |