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. template <char... Chars>
  32. struct MyString
  33. {
  34. static constexpr char value[] = { Chars..., '\0' };
  35. };
  36.  
  37. template <char... Chars>
  38. constexpr char MyString<Chars...>::value[];
  39.  
  40. int main()
  41. {
  42. typedef void(*function_t)(int);
  43. function_t ptrFunc = delegate<void, Class, int>::adapter<&Class::print, MyString<'A', 'B', 'C'>>::invoke_no_fwd;
  44. ptrFunc(-42); // 0
  45.  
  46. return 0;
  47. }
  48.  
Success #stdin #stdout 0s 3344KB
stdin
Standard input is empty
stdout
ABC
Class: -42