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. {
  11. static R invoke_no_fwd(Args... args)
  12. {
  13. C t((Ts::value)...);
  14. return (t.*F)(args...);
  15. }
  16. };
  17. };
  18.  
  19. class Class
  20. {
  21. public:
  22. Class(const char* psz) {
  23. std::cout << psz << std::endl;
  24. }
  25. void print(int v)
  26. {
  27. std::cout << "Class: " << v << std::endl;
  28. }
  29. };
  30.  
  31. static constexpr const char money[] = "money";
  32.  
  33. int main()
  34. {
  35. typedef void(*function_t)(int);
  36. function_t ptrFunc =
  37. delegate<void, Class, int>
  38. ::adapter<
  39. &Class::print,
  40. std::integral_constant<const char*, money> >::invoke_no_fwd;
  41. auto type = delegate<void, Class, int>::
  42. adapter<&Class::print, std::integral_constant<const char*, money>>::invoke_no_fwd;
  43. ptrFunc(-42);
  44. type(0);
  45.  
  46. return 0;
  47. }
  48.  
Success #stdin #stdout 0s 3340KB
stdin
Standard input is empty
stdout
money
Class: -42
money
Class: 0