fork download
  1. #include <functional>
  2.  
  3. template<class T>
  4. class Ptr {
  5. public:
  6. Ptr(T* ptr) : p(ptr) {}
  7. ~Ptr() { if(p) delete p; }
  8.  
  9. template<class Ret, class... Args>
  10. auto operator ->* (Ret (T::*method)(Args...)) -> std::function<Ret(Args...)>
  11. {
  12. return [this, method](Args&&... args) -> Ret { return (this->p->*method)(std::forward<Args>(args)...); };
  13. }
  14.  
  15. private:
  16. T *p;
  17. };
  18.  
  19. class Foo {
  20. public:
  21. void foo(int) {}
  22. int bar() { return 3; }
  23. };
  24.  
  25. int main() {
  26. Ptr<Foo> p(new Foo());
  27.  
  28. void (Foo::*method)(int) = &Foo::foo;
  29. int (Foo::*method2)() = &Foo::bar;
  30.  
  31. (p->*method)(5);
  32. (p->*method2)();
  33.  
  34. return 0;
  35. }
  36.  
Success #stdin #stdout 0s 2956KB
stdin
Standard input is empty
stdout
Standard output is empty