fork download
  1. #include <iostream>
  2. #include <functional>
  3.  
  4.  
  5. template<typename T, typename R, typename ... Args>
  6. std::function<R (Args...)> MakeDelegate(T *obj, R (T::*ptr)(Args ...))
  7. {
  8. return [obj, ptr](Args ... args)-> R {return (obj->*ptr)(args...);};
  9. }
  10.  
  11. template<typename T, typename R, typename ... Args>
  12. auto DelegateType(R (T::*ptr)(Args ...))->decltype(MakeDelegate<T>(nullptr, ptr));
  13.  
  14. class A
  15. {
  16. public:
  17. void f1(int arg){std::cout << "A::f1(" << arg << ")" << std::endl;};
  18. void f2(int arg1, int arg2){std::cout << "A::f2(" << arg1 << ", " << arg2 << ")" << std::endl;};
  19. };
  20.  
  21. A a;
  22.  
  23. class B
  24. {
  25. public:
  26. B() : m_d1(MakeDelegate(&a, &A::f1)), m_d2(MakeDelegate(&a, &A::f2))
  27. {
  28.  
  29. }
  30.  
  31. void test()
  32. {
  33. m_d1(40);
  34. m_d2(50, 60);
  35. }
  36. private:
  37. decltype(DelegateType(&A::f1)) m_d1;
  38. decltype(DelegateType(&A::f2)) m_d2;
  39. };
  40.  
  41. auto Delegate1 = MakeDelegate(&a, &A::f1);
  42. auto Delegate2 = MakeDelegate(&a, &A::f2);
  43.  
  44. int main()
  45. {
  46. Delegate1(10);
  47. Delegate2(20, 30);
  48.  
  49. B b;
  50. b.test();
  51.  
  52. return 0;
  53. }
  54.  
Success #stdin #stdout 0s 3032KB
stdin
Standard input is empty
stdout
A::f1(10)
A::f2(20, 30)
A::f1(40)
A::f2(50, 60)