fork download
  1. #include <functional>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. template <typename Arg, typename Result>
  7. void ho_fun(Result(*argFun)(Arg)) {
  8. Arg arg = 13;
  9.  
  10. argFun(arg);
  11. }
  12.  
  13. template <typename Arg1, typename Arg2, typename Result>
  14. void ho_fun(Result (*argFun)(Arg1, Arg2)) {
  15. Arg1 arg1 = 13;
  16. Arg2 arg2 = 42;
  17.  
  18. argFun(arg1, arg2);
  19. }
  20.  
  21. template <typename T, typename Arg, typename Result>
  22. void ho_fun(Result(T::*argFun)(Arg)) {
  23. T myClass;
  24. Arg arg = 13;
  25.  
  26. (myClass.*argFun)(arg);
  27. }
  28.  
  29. template <typename T, typename Arg1, typename Arg2, typename Result>
  30. void ho_fun(Result(T::*argFun)(Arg1, Arg2)) {
  31. T myClass;
  32. Arg1 arg1 = 13;
  33. Arg2 arg2 = 42;
  34.  
  35. (myClass.*argFun)(arg1, arg2);
  36. }
  37.  
  38. template <typename T, typename Arg, typename Result>
  39. void ho_fun(Result(T::*argFun)(Arg) const) {
  40. T myClass;
  41. Arg arg = 13;
  42.  
  43. (myClass.*argFun)(arg);
  44. }
  45.  
  46. template <typename T, typename Arg1, typename Arg2, typename Result>
  47. void ho_fun(Result(T::*argFun)(Arg1, Arg2) const) {
  48. T myClass;
  49. Arg1 arg1 = 13;
  50. Arg2 arg2 = 42;
  51.  
  52. (myClass.*argFun)(arg1, arg2);
  53. }
  54.  
  55. template <class T>
  56. void ho_fun(T argFun) {
  57. ho_fun(&T::operator());
  58. }
  59.  
  60. int oneFun(int a) { return -a; }
  61. int twoFun(int a, int b) { return a + b; }
  62.  
  63. struct Foo {
  64. int oneFun(int a) { return -a; }
  65. int twoFun(int a, int b) { return a + b; }
  66. };
  67.  
  68. int main() {
  69. ho_fun(oneFun);
  70. ho_fun(twoFun);
  71. ho_fun(&Foo::oneFun);
  72. ho_fun(&Foo::twoFun);
  73. ho_fun(negate<int>());
  74. ho_fun(plus<int>());
  75. }
Success #stdin #stdout 0s 16064KB
stdin
Standard input is empty
stdout
Standard output is empty