fork download
  1. #include <type_traits>
  2. #include <functional>
  3. #include <iostream>
  4. #include <cstdlib>
  5.  
  6. template <class Functor, class... Args>
  7. void run_helper(std::false_type, Functor f, Args&&... args)
  8. {
  9. f(std::forward<Args>(args)...);
  10. }
  11.  
  12. template <class Functor, class Arg0, class... Args>
  13. void run_helper(std::true_type, Functor f, Arg0&& arg0, Args&&... args)
  14. {
  15. (std::forward<Arg0>(arg0).*f)(std::forward<Args>(args)...);
  16. }
  17.  
  18. template <class Functor, class... Args>
  19. void run(Functor f, Args&&... args)
  20. {
  21. run_helper(typename std::is_member_pointer<Functor>::type(),
  22. f, std::forward<Args>(args)...);
  23. }
  24.  
  25. void freeFunction(int n) { std::cout << n << "\n"; }
  26.  
  27. struct Foo
  28. {
  29. void memberFunction(int n) { std::cout << n << "\n"; }
  30. };
  31.  
  32. struct Bar
  33. {
  34. void overloadedMemberFunction(int n) { std::cout << n << "\n"; }
  35. void overloadedMemberFunction(long n) { std::abort(); }
  36. };
  37.  
  38. struct Baz
  39. {
  40. template <class T>
  41. void templateMemberFunction(T n) { std::cout << n << "\n"; }
  42. };
  43.  
  44. int main() {
  45. run(freeFunction, 1111);
  46.  
  47. auto lambda = [](int n){ std::cout << n << "\n"; };
  48. run(lambda, 2222);
  49.  
  50. Foo foo;
  51. run(&Foo::memberFunction, foo, 3333);
  52.  
  53. Bar bar;
  54. run<void(Bar::*)(int)>(&Bar::overloadedMemberFunction, bar, 4444);
  55.  
  56. Baz baz;
  57. run<void(Baz::*)(int)>(&Baz::templateMemberFunction, baz, 5555);
  58. }
Success #stdin #stdout 0s 3340KB
stdin
Standard input is empty
stdout
1111
2222
3333
4444
5555