|
Boost : |
From: Shankar Sai (sai.shankar_at_[hidden])
Date: 2001-02-07 23:00:42
Hi,
Is there any interest in a library that would enable member variables
to be used with the STL algorithms without having to write trivial
functions? In case I'm not being clear <g>, here's an example.
Consider a GUI having a screen where there are 10 columns of data. One
requirement is that the GUI should be capable of being sorted on all 10
columns.
The data is in a struct.
struct Data
{
int column1_;
int column2_;
/* ... elided for brevity ... */
int column10_;
};
There is a vector vec holding all the records.
You need to be able to sort on any of these fields. The idea of writing
10 trivial comparision functions is not really inspiring :-)
Would there be any interest in writing functionals which would enable
/* Sort in descending order */
std::sort (vec.begin (),
vec.end (),
make_member_comparer (&Data::column1_,
std::greater <int> ())) ;
(or)
/* Sort in ascending order by default */
std::sort (vec.begin (),
vec.end (),
make_member_comparer (&Data::column1_)) ;
This was inspired by a posting on news:borland.public.cppbuilder.language
on "STL sorting question,,," by Nigel Eke. Chris Uzdavinis independently
came up with the same solution there.
The code can be found below:
#include <functional>
// Templates for comparing member variables
// Default comparision: std::less
template <class T, class Member, class Comp>
struct member_comparer : public std::binary_function <T, T, bool>
{
member_comparer (Member (T::*ptr), Comp const& cmp):
ptr_ (ptr),
cmp_ (cmp)
{
}
bool operator () (T const& x, T const& y) const
{
return cmp_ (x.*ptr_, y.*ptr_);
}
Member T::*ptr_;
Comp cmp_;
};
// Convenience functions for template argument deduction
template <class T, class Member>
member_comparer <T, Member, std::less <Member> >
make_member_comparer (Member T::*ptr)
{
return member_comparer <T, Member, std::less <Member> > (ptr, std::less
<Member> ());
}
template <class T, class Member, class Comp>
member_comparer <T, Member, Comp>
make_member_comparer (Member T::*ptr, Comp const& cmp)
{
return member_comparer <T, Member, Comp> (ptr, cmp);
}
What do you think?
Best Regards,
Sai Shankar
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk