//================================================================
template<
class Class,typename Type,
Type Class::*PtrToMember,
typename Compare=std::less<Type> >
struct less_by
{
less_by(const Compare& comp=Compare()):comp(comp){} bool operator()(const Class& x,const Class& y)const
{
return comp(x.*PtrToMember,y.*PtrToMember);
} bool operator()(const Type& x,const Class& y)const
{
return comp(x,y.*PtrToMember);
} bool operator()(const Class& x,const Type& y)const
{
return comp(x.*PtrToMember,y);
}private: Compare comp; }; //================================================================
[That was cut from the "multindex" trial code.] The author later decided to segregate the extraction from the comparison. No code has been given yet, but that class could be like:
//================================================================
template<
class Class,typename Type,
Type Class::*PtrToMember >
struct member
{
Type const & operator ()( Class const &c ) const
{ return c.*PtrToMember; } Type & operator ()( Class &c ) const
{ return c.*PtrToMember; }
};
//================================================================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; }
};
//================================================================Or we can simplify the type extraction, at the cost/gain of needing to specify the exact member at construction time by:
//================================================================
template < class Class, typename Type >
class member_extractor
{
public:
typedef Class argument_type;
typedef Type return_type;typedef Type Class::* member_type;
explicit member_extractor( member_type m )
: member_( m ) {} return_type const & operator ()( argument_type const &c ) const
{ return c.*member_; } return_type & operator ()( argument_type &c ) const
{ return c.*member_; } member_type get_member() const
{ return this->member_; }private: member_type member_; }; //================================================================
Daryle
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
