fork download
  1. #include <iostream>
  2. #include <functional>
  3.  
  4. using namespace std;
  5.  
  6. typedef int value;
  7.  
  8. // для одного аргумента
  9.  
  10.  
  11. // Констатнтый метод - и лямбда и std::function идут сюда
  12. template<class F, class R, class Arg1>
  13. function<void(int, value[])>
  14. thunk_impl( F f, R(F::*)(Arg1) const )
  15. {
  16. return [f](int, value v[]) -> R
  17. {
  18. return f(v[0]);
  19. };
  20. }
  21.  
  22. // Неконстантный метод
  23. template<class F, class R, class Arg1>
  24. function<void(int, value[])>
  25. thunk_impl( F f, R(F::*)(Arg1) )
  26. {
  27. return [f](int, value v[]) -> R
  28. {
  29. return f(v[0]);
  30. };
  31. }
  32.  
  33. // Свободная функция
  34. template<class F, class R, class Arg1>
  35. function<void(int, value[])>
  36. thunk_impl( F f, R(Arg1) )
  37. {
  38. return [f](int, value v[]) -> R
  39. {
  40. return f(v[0]);
  41. };
  42. }
  43.  
  44. // для двух аргументов
  45.  
  46. // Констатнтый метод - и лямбда и std::function идут сюда
  47. template<class F, class R, class Arg1, class Arg2>
  48. function<void(int, value[])>
  49. thunk_impl( F f, R(F::*)(Arg1, Arg2) const )
  50. {
  51. return [f](int, value v[]) -> R
  52. {
  53. return f(v[0], v[1]);
  54. };
  55. }
  56.  
  57. // Неконстантный метод
  58. template<class F, class R, class Arg1, class Arg2>
  59. function<void(int, value[])>
  60. thunk_impl( F f, R(F::*)(Arg1, Arg2) )
  61. {
  62. return [f](int, value v[]) -> R
  63. {
  64. return f(v[0], v[1]);
  65. };
  66. }
  67.  
  68. // Свободная функция
  69. template<class F, class R, class Arg1, class Arg2>
  70. function<void(int, value[])>
  71. thunk_impl( F f, R(Arg1, Arg2) )
  72. {
  73. return [f](int, value v[]) -> R
  74. {
  75. return f(v[0], v[1]);
  76. };
  77. }
  78.  
  79.  
  80. // и так далее...
  81.  
  82. // Методы
  83. template<class F>
  84. function<void(int, value[])>
  85. thunk( F f )
  86. {
  87. return thunk_impl<F>(f, &F::operator());
  88. }
  89.  
  90.  
  91. // Указатели на функции
  92. template<class F>
  93. function<void(int, value[])>
  94. thunk( F* f )
  95. {
  96. return thunk_impl<F*>(f, f);
  97. }
  98.  
  99. void f1(int p1) { cout << "f1\t" << p1 << "\n"; }
  100. void f2(int p1, int p2) { cout << "f2\t" << p1 << "\t" << p2 << "\n"; }
  101.  
  102. int main() {
  103. //int a1[] = {1};
  104. int a2[] = {3, 4};
  105.  
  106. // case 1
  107. auto ufunc = thunk( f2 );
  108. ufunc(2,a2);
  109.  
  110.  
  111. // case 2
  112. auto ff2 = [](int p1, int p2) { cout << "ff2\t" << p1 << "\t" << p2 << "\n"; };
  113.  
  114. auto ufunc2 = thunk( ff2 );
  115. ufunc2(2,a2);
  116.  
  117. return 0;
  118. }
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
f2	3	4
ff2	3	4