Re: Template function overloading question
Juha Nieminen wrote:
Victor Bazarov wrote:
I believe the common way to do that is to use not a member function
call, but a functor, and pass the container element to it:
template<class C, class F>
void ForEach(C c, F f) {
for(typename Container::const_iterator iter = c.begin();
iter != c.end(); ++iter)
{
f(*iter);
}
}
and when you need to use a member function, use binders (see
<functional> and 'bind1st', 'bind2nd', etc)
That didn't really answer my question.
OK, sorry about that. I thought you needed a generic commonly used
solution for doing 'ForEach' stuff, and you are just asking for the
syntax... My bad.
Here you go
template<class C, class T>
void ForEach(C c, void (T::*member)() const)
{
for(typename C::const_iterator iter = c.begin();
iter != c.end(); ++iter)
{
((*iter).*member)();
}
}
template<class C>
void ForEach(C c, void (*fptr)(typename C::value_type const&))
{
for(typename C::const_iterator iter = c.begin();
iter != c.end(); ++iter)
{
fptr(*iter);
}
}
#include <vector>
struct A
{
void print() const {}
};
void print(A const&) {}
int main()
{
std::vector<A> va;
ForEach(va, &A::print);
ForEach(va, print);
}
Does *that* answer your question?
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask