/*============================================================================= 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 #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable: 4180) // qualifier applied to function type has no meaning; ignored #endif 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::class_member_traits::class_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::class_member_traits::class_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; }; }}} #ifdef _MSC_VER #pragma warning(pop) #endif #endif