/*============================================================================= Copyright (c) 2001-2007 Joel de Guzman 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) ==============================================================================*/ #ifndef BOOST_PHOENIX_CORE_DETAIL_MEMBER_VARIABLE_HPP #define BOOST_PHOENIX_CORE_DETAIL_MEMBER_VARIABLE_HPP #include #include namespace boost { namespace phoenix { namespace detail { template struct member_variable { template struct result; template struct result : result {}; template struct result { typedef typename boost::mpl::if_c< boost::is_const< typename boost::remove_pointer< typename boost::remove_reference::type >::type >::value , const RT& , RT& >::type type; }; member_variable(MP mp) : mp(mp) {} template RT& operator()(Class& obj) const { BOOST_PROTO_USE_GET_POINTER(); typedef typename proto::detail::classtypeof::type class_type; return (BOOST_PROTO_GET_POINTER(class_type, obj)->*mp); } template RT const& operator()(Class const& obj) const { BOOST_PROTO_USE_GET_POINTER(); typedef typename proto::detail::classtypeof::type class_type; return (BOOST_PROTO_GET_POINTER(class_type, obj)->*mp); } template RT& operator()(Class* obj) const { return obj->*mp; } template RT const& operator()(Class const* obj) const { return obj->*mp; } MP mp; }; }}} #endif