$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Vincent Poinot (vincent.poinot_at_[hidden])
Date: 2007-06-20 14:16:43
Hello,
I recently developped some small utility classes and I wonder if this could
be interesting for other people.
The motivation is the following: when manipulating containers of pointers,
standard algorithms won't work out of the box, e.g. if I want to sort a
vector of pointers to a class X, I have to pass to sort() a new comparison
function object that will dereference its arguments so that the proper
operator< may be called on the values.
So I wrote a piece of code that creates this new "dereferencing" function
object automatically. Here is what it looks like, assuming a class X with a
properly defined operator<(const X&, const X&)
int main()
{
vector<X*> v ;
// Populate v here
// Testing dereferencing of binary function object
sort(v.begin(), v.end(), deref<X*>(less<X>())) ;
}
As you can see, the available comparison function objects operates on
objects X, the deref() helper function creates a new function object that
will call the original less<>() after dereferencing its arguments, allowing
sort() to work as expected.
Two other examples (assuming there is also an operator+ and an operator==
for X objects):
X sum = accumulate(v.begin(), v.end(), X(), deref<X*>(plus<X>())) ;
remove_if(v.begin(), v.end(),
deref<X*>(bind2nd(equal_to<X>(), X(something)))) ;
I am well aware that lambda functions can solve this problem much more
elegantly, but the reason why I wrote this is that I cannot use Boost at
work :-( And now that it is written, well, maybe somebody else can find
this useful...
(This stuff also works with smart pointers.)
Vincent Poinot.