Boost.Bind to access std::map elements in std::for_each
bind, boost, c++, foreach, stdmap
Solution
IIRC, Boost.Bind uses `boost::mem_fn` for its binding to members capability. Now, if you look at mem_fun (scroll down to the `// data member support` part), you'll see that it typedefs its result_type as a const&, while is still has overloads of the function call operator supporting the extraction of a non-const member from a non-const argument.
It thus seems that the problem is that this confuses Boost.Bind's return type deduction mechanism. A solution would thus to explicitly tell Bind that the result is not const:
//call the non-const member function
std::for_each(theMap.begin(), theMap.end(),
boost::bind(&MyStruct::someFunction,
boost::bind<MyStruct&>(&MyMap::value_type::second, _1)
)
);
Problem
I've got a map that stores a simple struct with a key. The struct has two member functions, one is const the other not. I've managed calling the const function using std::for_each without any problems, but I've got some problems calling the non-const function. ``` struct MyStruct { void someConstFunction() const; void someFunction(); }; typedef std::map<int, MyStruct> MyMap; MyMap theMap; //call the const member function std::for_each(theMap.begin(), theMap.end(), boost::bind(&MyStruct::someConstFunction, boost::bind(&MyMap::value_type::second, _1))); //call the non-const member function std::for_each(theMap.begin(), theMap.end(), boost::bind(&MyStruct::someFunction, boost::bind(&MyMap::value_type::second, _1))); ``` The call to the const member function works fine, but it seems boost internally expects a const MyStruct somewhere, and thus fails with the following compilation error in MSVC7.1. boost\bind\mem_fn_template.hpp(151): error C2440: 'argument' : cannot convert from 'const MyStruct *__w64 ' to 'MyStruct *const ' I'd appreciate any help on how to set the template parameters correctly, so bind does recognize the parameters correctly and let me call the non const function. thanks, Carl