1 // { dg-do run { target c++11 } }
2 // A basic implementation of TR1's mem_fn using variadic teplates
3 // Contributed by Douglas Gregor <doug.gregor@gmail.com>
4 #include <cassert>
5 
6 template<typename R, typename Class, typename... Args>
7 class Mem_fn
8 {
9  public:
Mem_fn(R (Class::* pmf)(Args...))10   explicit Mem_fn(R (Class::*pmf)(Args...)) : pmf(pmf) { }
11 
operator()12   R operator()(Class& object, Args... args)
13   {
14     return (object.*pmf)(args...);
15   }
16 
operator()17   R operator()(Class* object, Args... args)
18   {
19     return (object->*pmf)(args...);
20   }
21 
22   R (Class::*pmf)(Args...);
23 };
24 
25 template<typename R, typename Class, typename... Args>
26 inline Mem_fn<R, Class, Args...>
mem_fn(R (Class::* pmf)(Args...))27 mem_fn(R (Class::* pmf)(Args...))
28 {
29   return Mem_fn<R, Class, Args...>(pmf);
30 }
31 
32 class X {
33  public:
negate(int x)34   int negate(int x) { return -x; }
plus(int x,int y)35   int plus(int x, int y) { return x + y; }
36 };
37 
main()38 int main()
39 {
40   X x;
41   X* xp = &x;
42 
43   assert(mem_fn(&X::negate)(x, 17) == -17);
44   assert(mem_fn(&X::negate)(xp, 17) == -17);
45   assert(mem_fn(&X::plus)(x, 17, 25) == 42);
46   assert(mem_fn(&X::plus)(xp, 17, 25) == 42);
47 
48   return 0;
49 }
50