fork download
  1. #include <iostream>
  2. #include <functional>
  3.  
  4. template <typename func_t, func_t func>
  5. struct Foo {
  6. template <typename... Arguments>
  7. void execute(Arguments... args) {
  8. func(args ...);
  9. }
  10. };
  11.  
  12. template <typename T, typename func_t, func_t func>
  13. struct FooMember {
  14. T member;
  15.  
  16. FooMember(T member) : member(member) {}
  17.  
  18. template <typename... Arguments>
  19. void execute(Arguments... args) {
  20. std::function<void(T&, Arguments ...)> f(func);
  21. f(this->member, args ...);
  22. }
  23. };
  24.  
  25. /////////////////////////////////////////////
  26.  
  27. struct Bar {
  28. int z;
  29.  
  30. Bar(int z) : z(z) {}
  31. void add(int x, int y) { std::cout << x + y + z << std::endl; }
  32. };
  33.  
  34. void padd(int x, int y, int z) { std::cout << x + y + z << std::endl; }
  35.  
  36. int main() {
  37. auto a = Foo<decltype(&padd), &padd>();
  38. auto b = FooMember<Bar, decltype(&Bar::add), &Bar::add>(Bar(2));
  39.  
  40. a.execute(4, 5, 6); // prints 4+5+6 : 15
  41. b.execute(4, 5); // prints 4+5+a.z : 4+5+2 : 11
  42.  
  43. return 0;
  44. }
  45.  
Success #stdin #stdout 0s 2852KB
stdin
Standard input is empty
stdout
15
11