Boost logo

Boost :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2002-09-17 06:47:19

From: "Shane Beasley" <sbeasley_at_[hidden]>
> I have a std::map<K, Foo> over which I wish to iterate, using STL and
> Boost templates to call a non-const member function on each Foo object.
> The solution would appear to be something like
> std::for_each(m.begin(), m.end(), func);
> where func(x) would call x.second.mem_fun(). The trouble is defining func
> in terms of STL and Boost components. [...]
> (a) In theory, I should be able to use compose_f_gx, [...]

> (b) Use boost::lambda to do something similar to the above.[...]

This is rapidly turning into a FAQ. :-)

compose_f_gx can be emulated by both boost::bind and lambda::bind as bind(f,
bind(g, _1)).

Lambda can access a data member as (&_1)->*&std::map<K,
Foo>::value_type::second. Boost.Bind can do the same via the syntax
bind(&std::map<K, Foo>::value_type::second, _1).

The most practical solution, though, is to sidestep the member access issue:

template<class It, class F> void for_each_pair(It first, It last, F f)
    for(; first != last; ++first)
        f(first->first, first->second);

for_each_pair(m.begin(), m.end(), boost::bind(&Foo::mem_fun, _2));

Boost list run by bdawes at, gregod at, cpdaniel at, john at