#include <vector>
#include <iostream>
template<typename X>
struct call_on {
call_on(const X& x) : x(x) { }
X x;
template<typename F, typename... Args>
void operator()(F f, Args&&... args) const { f(x, std::forward<Args>(args)...); }
template<typename Ret, typename C, typename... Args>
void operator()(Ret (C::*fun)(Args...) const, Args&&... args) {
(x.*fun)(std::forward<Args>(args)...);
}
template<typename Ret, typename C, typename... Args>
void operator()(Ret (C::*fun)(Args...), Args&&... args) {
(x.*fun)(std::forward<Args>(args)...);
}
};
template<typename InputIterator, typename F>
void for_each(InputIterator begin, InputIterator end, F f) {
if(begin == end) return;
while(begin != end) {
f(*begin++);
}
}
template<typename InputIterator, typename Ret, typename C>
void for_each(InputIterator begin, InputIterator end, Ret (C::*fun)() const) {
if(begin == end) return;
while(begin != end) {
(*begin++.*fun)();
}
}
template<typename InputIterator, typename Ret, typename C>
void for_each(InputIterator begin, InputIterator end, Ret (C::*fun)()) {
if(begin == end) return;
while(begin != end) {
(*begin++.*fun)();
}
}
struct Foo {
void bar() const { std::cout << "Foo::bar" << std::endl; }
void baz(int x, int y) {
std::cout << x << " " << y << std::endl;
}
};
int main()
{
Foo f;
call_on<Foo&> call(f);
call(&Foo::bar);
call(&Foo::baz, 23, 42);
std::vector<Foo> vs;
for_each(vs.begin(), vs.end(), &Foo::bar);
return 0;
}