Boost logo

Boost :

From: Joaquín Mª López Muñoz (joaquin_at_[hidden])
Date: 2003-07-14 07:24:37


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

which takes us again to the redundancy we were trying to avoid.
Something in the way of eliminating this redundancy, however, would be
a boon. Maybe some metaprogramming gurus here can think of
something.

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


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk