fork download
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. using namespace std;
  5.  
  6. typedef int (*FUNC)(int, int);
  7. typedef int (*CALL)(FUNC, int, int);
  8.  
  9. int add(int, int);
  10. int mul(int, int);
  11.  
  12. int call1(int (*)(int, int), int, int); // 関数ポインタそのまま
  13. int call2(FUNC, int, int); // typedefすると簡潔に書ける
  14.  
  15. int callcallA(CALL, FUNC, int, int); // 大量の関数ポインタの引数があっても簡潔に書ける!
  16.  
  17. // 真面目に書くと? カオスの極み
  18. int callcallB(int (*)(int (*)(int, int), int, int), int (*)(int, int), int, int);
  19.  
  20. int main() {
  21.  
  22. int (*f)(int,int); // 関数ポインタそのまま
  23. FUNC g; // typedefすると簡潔に書ける
  24.  
  25. srand((unsigned int)time(NULL));
  26.  
  27. if (rand() & 1) {
  28. f = add;
  29. g = add;
  30. } else {
  31. f = mul;
  32. g = mul;
  33. }
  34. cout << (*f)(111, 9) << endl;
  35. cout << (*g)(111, 9) << endl;
  36.  
  37. cout << call1(add, 10, 203) << endl;
  38. cout << call1(mul, 10, 203) << endl;
  39.  
  40. cout << call2(add, 10, 203) << endl;
  41. cout << call2(mul, 10, 203) << endl;
  42.  
  43. cout << callcallA(call1, mul, 7, 111) << endl;
  44. cout << callcallA(call2, mul, 7, 111) << endl;
  45.  
  46. cout << callcallB(call1, mul, 7, 111) << endl;
  47. cout << callcallB(call2, mul, 7, 111) << endl;
  48.  
  49. return 0;
  50. }
  51.  
  52. int call1(int (*f)(int, int), int a, int b) { // 関数ポインタそのまま
  53. return (*f)(a, b);
  54. }
  55.  
  56. int call2(FUNC f, int a, int b) { // typedefすると簡潔に書ける
  57. return (*f)(a, b);
  58. }
  59.  
  60. int callcallA(CALL c, FUNC f, int a, int b) {
  61. return (*c)(f, a, b);
  62. }
  63.  
  64. int callcallB(int (*c)(int (*)(int, int), int, int), int (*f)(int, int), int a, int b) {
  65. return (*c)(f, a, b);
  66. }
  67.  
  68.  
  69. int add(int a, int b) {
  70. return a + b;
  71. }
  72.  
  73. int mul(int a, int b) {
  74. return a * b;
  75. }
Success #stdin #stdout 0s 3340KB
stdin
Standard input is empty
stdout
120
120
213
2030
213
2030
777
777
777
777