I have made a small example in order to understand how boost::bind () works with collections. I have a class called Data:
class Data
{
public:
void print ();
const std::string& get () const;
std::string& get () ;
};
I have created a std::vector of Data objects called samples and I am able to use bind in the same way as std::mem_fun_ref works.
std::for_each (samples.begin (),samples.end (),std::mem_fun_ref (&Data::print));
std::for_each (samples.begin (),samples.end (),boost::bind (&Data::print,_1));
The basic idea is that the bind returns a function object of type bind_t<RetType=void, ObjType=Data, ArgType=void>. The member function as the first parameter allows the compiler to deduce RetType, ObjType and ArgType. The placeholder _1 corresponds to the data object which must be provided by the algorithm.
Then std::for_each calls the function object "for each" element in the following way:
for ( ; first!=last; ++first ) f(*first);
bind_t::operator(ObjType& obj) is invoked and its definition should be something like this:
return (obj.*_method ());
I have crated a class called Filter that performs some processing over a data element.
class Filter
{
void filter (Data& data);
...
};
If I want to apply the filter over the data elements in the vector I call bind in the following way:
std::for_each (samples.begin (),samples.end (),boost::bind (&Filter::filter,filter,_1));
for_each passes a Data object to bind_t::operator(). In this case the function object already has the object and just need the parameter so in this case placeholder _1 refers to the argument.
Here comes my question:
How can use bind if I have to iterate over a std::map rather than a vector?
(Sorry for all the explanation, I just want to make sure that I understand the way in which bind works)
std::for_eachis going to pass me astd::pair<key,Data>whereasFilter::filterexpects a reference toData.bindworks (maybe I misunderstood something). Related to your second question, it will be different as now the function object receives astd::pairrather than a reference to the nextvectorelement.std::map<int,Data>and I want to apply the filter over all the data elements. That is, if I call:std::for_each (sampleMap.begin (),sampleMap.end (),boost::bind (&Filter::filter,filter,_1))I get the following error:error: no match for call to (boost::_mfi::mf1<void, Filter, Data&>) (Filter&, std::pair<const int, Data>&). Nowfor_eachis passing astd::pairsince I am iterating over a map rather than a vector.