// { dg-do run { target c++11 } }
// A basic implementation of TR1's mem_fn using variadic teplates
// Contributed by Douglas Gregor <doug.gregor@gmail.com>
#include <cassert>

template<typename R, typename Class, typename... Args>
class Mem_fn
{
 public:
  explicit Mem_fn(R (Class::*pmf)(Args...)) : pmf(pmf) { }

  R operator()(Class& object, Args... args)
  {
    return (object.*pmf)(args...);
  }

  R operator()(Class* object, Args... args)
  {
    return (object->*pmf)(args...);
  }

  R (Class::*pmf)(Args...);
};

template<typename R, typename Class, typename... Args>  
inline Mem_fn<R, Class, Args...>
mem_fn(R (Class::* pmf)(Args...))
{
  return Mem_fn<R, Class, Args...>(pmf);
}

class X {
 public:
  int negate(int x) { return -x; }
  int plus(int x, int y) { return x + y; }
};

int main()
{
  X x;
  X* xp = &x;

  assert(mem_fn(&X::negate)(x, 17) == -17);
  assert(mem_fn(&X::negate)(xp, 17) == -17);
  assert(mem_fn(&X::plus)(x, 17, 25) == 42);
  assert(mem_fn(&X::plus)(xp, 17, 25) == 42);

  return 0;
}
