Re: using a member function as a sort predicate
On 11 Jun., 03:24, dailos <dailos.guerr...@gmail.com> wrote:
I've been dwelling on using a member function as a sort predicate,
as follows:
class foo
{
private:
std::vector<std::string> fileNameList;
bool moreRecentlyCreatedFile(std::string fileName1,
std::string fileName2);
void putInOrder();
};
bool foo::moreRecentlyCreatedFile(std::string fileName1,
std::string fileName2)
{
//some algorithms to find out the creation date of both files
return creationDateFile1 < creationDateFile2;
}
If you don't intend to modify the strings you might want to take them
via a reference to const. Also, consider making this member function
const:
bool moreRecentlyCreatedFile(std::string const& fileName1,
std::string const& fileName2) const;
No, this is /not/ premature optimization. :)
void foo::puInOrder()
{
std::sort(fileNameList.begin(), fileNameList.end(),
&foo::moreRecentlyCreatedFile);
}
But it simply doesn`t compile.
Rightfully so. A member function pointer doesn't support the same
syntax as a function pointer to a free function when it comes to
invocation. But this function call syntax is expected to work.
There is away to turn a member function pointer into a functor via
std::memfun. Then, you would only need to bind the first parameter
(this-pointer). But std::memfun only supports member functions with up
to one parameter. So, you have to write the wrapper by yourself (or
use Boost.Bind / TR1 bind).
class MyCompare {
foo const* pfoo;
public:
explicit MyCompare(foo const* pf) : pfoo(pf) {}
bool operator()(std::string const& lhs, std::string const& rhs)
{
return pfoo->moreRecentlyCreatedFile(lhs,rhs);
}
};
void foo::puInOrder()
{
std::sort(fileNameList.begin(), fileNameList.end(),
MyCompare(this) );
}
I successfully did something similar for for_each algorithm:
for_each(fileNameList.begin(), fileNameList.end(), std::bind1st
( std::mem_fun( &foot::checkFile ), this ));
Oh, you knew about those already.
How could I apply that to two-arguments predicates??
You can't. Either do it manually (like shown above) or use Boost.Bind
or TR1's bind. I'm not 100% sure about those but I'm assuming they
support member functions with more than one parameter.
Cheers!
SG
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]