fork download
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. template< typename R, typename C, typename... Args>
  5. class delegate
  6. {
  7. public:
  8. template<R(C::*F)(Args...), typename ... Ts>
  9. struct adapter {
  10. static R invoke_no_fwd(Args... args) {
  11. C t(Ts::value...);
  12. return (t.*F)(args...);
  13. }
  14. };
  15. };
  16.  
  17. class Class
  18. {
  19. public:
  20. Class(int param) : m_val(param) {}
  21. void print(int v) {
  22. std::cout << "Class: " << v + m_val << std::endl;
  23. }
  24. private:
  25. int m_val;
  26. };
  27.  
  28. int main()
  29. {
  30. typedef void(*function_t)(int);
  31. function_t ptrFunc = (delegate<void, Class, int>::adapter<&Class::print, std::integral_constant<int, 42> >::invoke_no_fwd);
  32. auto type = (delegate<void, Class, int>::adapter<&Class::print, std::integral_constant<int, 42>>::invoke_no_fwd);
  33. ptrFunc(-42); // 0
  34. type(0); // 42
  35. return 0;
  36. }
  37.  
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
Class: 0
Class: 42