summaryrefslogtreecommitdiff
path: root/boost/phoenix/operator/member.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/phoenix/operator/member.hpp')
-rw-r--r--boost/phoenix/operator/member.hpp30
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