I wonder if there is support in STL for this:
Say I have an class like this :
class Person
{
public:
int getAge() const;
double getIncome() const
Generic adaptor to compare based on member attributes. While it is quite more verbose the first time it is reusable.
// Generic member less than
template
struct member_lt_type
{
typedef M T::* member_ptr;
member_lt_type( member_ptr p, C c ) : ptr(p), cmp(c) {}
bool operator()( T const & lhs, T const & rhs ) const
{
return cmp( lhs.*ptr, rhs.*ptr );
}
member_ptr ptr;
C cmp;
};
// dereference adaptor
template
struct dereferrer
{
dereferrer( C cmp ) : cmp(cmp) {}
bool operator()( T * lhs, T * rhs ) const {
return cmp( *lhs, *rhs );
}
C cmp;
};
// syntactic sugar
template
member_lt_type > member_lt( M T::*ptr ) {
return member_lt_type >(ptr, std::less() );
}
template
member_lt_type member_lt( M T::*ptr, C cmp ) {
return member_lt_type( ptr, cmp );
}
template
dereferrer deref( C cmp ) {
return dereferrer( cmp );
}
// usage:
struct test { int x; }
int main() {
std::vector v;
std::sort( v.begin(), v.end(), member_lt( &test::x ) );
std::sort( v.begin(), v.end(), member_lt( &test::x, std::greater() ) );
std::vector vp;
std::sort( v.begin(), v.end(), deref( member_lt( &test::x ) ) );
}