[ create a new paste ] login | about

Link: http://codepad.org/vqyTp2Ar    [ raw code | output | fork ]

C++, pasted on Mar 13:
#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;
}


Output:
1
2
Line 9: error: expected nested-name-specifier before '...' token
compilation terminated due to -Wfatal-errors.


Create a new paste based on this one


Comments: