In article <843a4f78.0408151512.4420cea8@posting.google.com >,
oldwolf@inspire.net.nz (Old Wolf) wrote:
[color=blue]
> I have a member function that acts on an object. I would also like to
> have a member function that acts on a container of such objects,
> using std::for_each. I tried:
>
> #include <algorithm>
> #include <functional>
>
> struct bar {
> template<typename T> void foo(T const &);
> template<typename InIt> void foo(InIt begin, InIt end)
> { std::for_each(begin, end, foo); }
> };
>
> but got a compiler error (at the point of calling foo, not at the point
> of declaration) because 'foo' was a pointer to member function, rather
> than a pointer to function. So I tried:
> std::for_each(begin, end, std::mem_fun(&foo));
> but got the error:
> Could not find a match for std::mem_fun<S,T>(void (bar::*)(const T &))
>
> Finally I tried:
> std::for_each(begin, end, std::mem_fun(&foo<typename InIt::value_type>));
> but got an ICE.
>
> What is the correct usage?[/color]
struct bar {
template < typename T >
void foo(const T) const { /* whatever */ }
template < typename InIt >
void foo(InIt begin, InIt end) const {
for_each(begin, end,
bind1st(mem_fun(&bar::foo<typename InIt::value_type>) ,this));
}
};
Note that foo no longer takes a 'const T&', it takes a 'const T'. This
is because of a problem with the language that you can't take a
reference to a reference. I think this is scheduled to be fixed in the
next version of C++?
[color=blue]
> I have in fact solved the problem with:
> { for (; begin != end; ++begin) foo(*begin); }
> but would like to know if it is possible with for_each anyway.[/color]
I would write it:
{ while (begin != end) foo( *begin++ ); }