John Torjo ha escrito:

> >
> >Subject: Re: [boost] About member extraction
> >   From: Joaquín Mª López Muñoz <[EMAIL PROTECTED]>
> >   Date: Mon, 14 Jul 2003 14:24:37 +0200
> >     To: Boost mailing list <[EMAIL PROTECTED]>
> >
> >
> >
> >Daryle Walker ha escrito:
> >
> >> But doesn't the "PtrToMember" template parameter already imply the
> >> "Type" and "Class" parameters?  So specifying all three would be
> >> redundant.  Could we reduce it by:
> >>
> >> //================================================================
> >> template < typename PtrToMember >
> >> struct member_extractor
> >> {
> >>    // Don't know if this is a real type-traits class
> >>    BOOST_STATIC_ASSERT(is_pointer_data_member<PtrToMember>::value);
> >>
> >>    // The extractor traits classes aren't real (yet, maybe)
> >>    typedef get_class_type<PtrToMember>  argument_type;
> >>    typedef get_member_type<PtrToMember>   return_type;
> >>
> >>    return_type const &  operator ()( argument_type const &c ) const
> >>      { return c.*PtrToMember; }
> >>
> >>    return_type &  operator ()( argument_type &c ) const
> >>      { return c.*PtrToMember; }
> >> };
> >
> >Of the approaches you propose, this is the one that I like best, but
> >I'm afraid it cannot be implemented: Note that PtrToMember is a
> >*type* (something like int A::*), not a pointer to member.
> >member_extractor would have to defined as
> >
> >template < typename PtrToMember, PtrToMember ptr >
> >struct member_extractor
> >
> >and used as
> >
> >member_extractor<int A::*,&A::x>; // x is an int member of A
>
> Actually, I think it's worse (I don't have a C++ compiler with me right now:-( )
>
> Something in the lines of:
>
> template < typename type, typename result, result type::* ptr >
> struct member_extractor
>
>

Actually, extracting "A" and "int" from "int A::*" is easy:

#include <boost/static_assert.hpp>
#include <boost/type_traits.hpp>

using namespace std;

struct A
{
  int x;
};

template <typename PtrToMember>
struct ptr_to_member_descriptor;

template <typename Class,typename Member>
struct ptr_to_member_descriptor<Member Class::*>
{
  typedef Class  class_type;
  typedef Member member_type;
};

int main()
{
  BOOST_STATIC_ASSERT((
    boost::is_same<
      ptr_to_member_descriptor<int A::*>::class_type,
      A>::value));

  BOOST_STATIC_ASSERT((
    boost::is_same<
      ptr_to_member_descriptor<int A::*>::member_type,
      int>::value));

  return 0;
}


The really hard part is how to obtain "int A::*" from "&A::x". I don't
think this is possible, but then again people here sometimes do magic :)

Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to