diff options
Diffstat (limited to 'boost/phoenix/operator/member.hpp')
-rw-r--r-- | boost/phoenix/operator/member.hpp | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/boost/phoenix/operator/member.hpp b/boost/phoenix/operator/member.hpp index 8c89e6a028..a489d46b26 100644 --- a/boost/phoenix/operator/member.hpp +++ b/boost/phoenix/operator/member.hpp @@ -11,6 +11,7 @@ #include <boost/phoenix/core/call.hpp> #include <boost/phoenix/operator/detail/mem_fun_ptr_gen.hpp> #include <boost/phoenix/support/iterate.hpp> +#include <boost/type_traits/remove_reference.hpp> #include <boost/type_traits/is_member_function_pointer.hpp> #include <boost/proto/operators.hpp> @@ -42,18 +43,21 @@ namespace boost { namespace phoenix { BOOST_PHOENIX_BINARY_OPERATORS((mem_ptr)) - template <typename Object, typename MemPtr> - inline - typename boost::enable_if< - is_member_function_pointer<MemPtr> - , detail::mem_fun_ptr_gen<actor<Object>, MemPtr> const - >::type - operator->*(actor<Object> const& obj, MemPtr ptr) - { - return detail::mem_fun_ptr_gen<actor<Object>, MemPtr>(obj, ptr); - } - - using proto::exprns_::operator->*; + template<> + struct phoenix_generator::case_<proto::tag::mem_ptr> + : proto::or_< + proto::when< + proto::and_< + proto::mem_ptr<meta_grammar, proto::terminal<proto::_> > + , proto::if_<is_member_function_pointer<boost::remove_reference<proto::call<proto::_value(proto::_right)> > >()> + > + , proto::call<detail::make_mem_fun_ptr_gen(proto::_left, proto::call<proto::_value(proto::_right)>)> + > + , proto::otherwise< + proto::call<proto::pod_generator<actor>(proto::_)> + > + > + {}; namespace result_of { @@ -117,7 +121,7 @@ namespace boost { namespace phoenix typename result_of::mem_fun_ptr_eval<Context, BOOST_PHOENIX_A>::type operator()( BOOST_PHOENIX_A_const_ref_a - , Context & ctx + , Context const & ctx ) const { return |