boost::bind and std::copy for member functions

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

boost::bind and std::copy for member functions

Leon Mergen-2
Hello,

Ok, this is what I'm trying to do: I want to define some base class A
which has a container with elements it needs to sort. I want to be
flexible with the comparison function, so the base class A will define
an abstract comparison function which will be implemented by derived
classes.

Since std::sort () expects function objects, after a lot of asking
around I found out I needed to use boost::bind. However, trying almost
all different types of combinations and looking up all kind of manuals,
I'm pretty much clueless...

Here's the test-case code:

---
#include <algorithm>
#include <string>
#include <vector>

#include <boost/bind.hpp>

class A {
public:
virtual bool sort (std::string const * const & a, std::string const *
const & b) const = 0;

void func () {
// std::sort ( _elements.begin(), _elements.end(), boost::mem_fn (
A::sort) );
std::sort ( _elements.begin(), _elements.end(), boost::bind ( A::sort,
this, _1, _2 ) );

}
private:
std::vector < std::string * > _elements;
};

class B : public A {
public:
virtual bool sort (std::string const * const & a, std::string const *
const & b) const {
return true;
}
};

class C : public A {
public:
virtual bool sort (std::string const * const & a, std::string const *
const & b) const {
return false;
}
};
---

I hope the code makes it a bit more clear as to what I'm trying to do...
I follow examples listed at threads like
http://blog.gmane.org/gmane.comp.lib.boost.user/day=20050617 , and well,
this is almost a literate copy of some recommendations but it doesn't work:

--
sort.cpp: In member function ‘void A::func()’:
sort.cpp:13: error: no matching function for call to ‘bind(<unknown
type>, A* const, boost::arg<1>&, boost::arg<2>&)’
/usr/local/include/boost/bind.hpp:1416: note: candidates are:
boost::_bi::bind_t<boost::_bi::unspecified, F, typename
boost::_bi::list_av_3<A1, A2, A3>::type> boost::bind(F, A1, A2, A3)
[with F = bool (A::*)(const std::string* const&, const std::string*
const&)const, A1 = A*, A2 = boost::arg<1>, A3 = boost::arg<2>]
/usr/local/include/boost/bind/bind_mf_cc.hpp:78: note:
boost::_bi::bind_t<R, boost::_mfi::cmf2<R, T, A1, A2>, typename
boost::_bi::list_av_3<A1, A2, A3>::type> boost::bind(R (T::*)(B1,
B2)const, A1, A2, A3) [with R = bool, T = A, B1 = const std::string*
const&, B2 = const std::string* const&, A1 = A*, A2 = boost::arg<1>, A3
= boost::arg<2>]
--

and well, the error is cryptic enough for me to not quite understand
what I'm doing wrong... any suggestions ?

Thanks in advance!

Regards,

Leon Mergen
_______________________________________________
Boost-users mailing list
[hidden email]
http://lists.boost.org/mailman/listinfo.cgi/boost-users
Reply | Threaded
Open this post in threaded view
|

Re: boost::bind and std::copy for member functions

Peter Dimov
Leon Mergen wrote:

> std::sort ( _elements.begin(), _elements.end(), boost::bind ( A::sort,
> this, _1, _2 ) );

Make that &A::sort. Pointers to members require the &.
_______________________________________________
Boost-users mailing list
[hidden email]
http://lists.boost.org/mailman/listinfo.cgi/boost-users
Reply | Threaded
Open this post in threaded view
|

Re: boost::bind and std::copy for member functions

Leon Mergen-2
Peter Dimov wrote:
> Leon Mergen wrote:
>
>  
>> std::sort ( _elements.begin(), _elements.end(), boost::bind ( A::sort,
>> this, _1, _2 ) );
>>    
>
> Make that &A::sort. Pointers to members require the &.
>  
D'oh, that was stupid... it even works now, thanks a lot!! :)

Grt,

Leon
_______________________________________________
Boost-users mailing list
[hidden email]
http://lists.boost.org/mailman/listinfo.cgi/boost-users