fork download
  1. #include <stdio.h>
  2. #include <vector>
  3.  
  4. class Foo
  5. {
  6. int val;
  7. public:
  8. Foo(int x): val(x) {}
  9. ~Foo() {}
  10.  
  11. void methodA(int a)
  12. {
  13. val += a;
  14. printf("add: %d\r\n", val);
  15. }
  16.  
  17. void methodB(int a)
  18. {
  19. val -= a;
  20. printf("minus: %d\r\n", val);
  21. }
  22. };
  23.  
  24. int main()
  25. {
  26. // -------------------------------------------------------------------------------------------
  27. // メンバ関数のポインタを持たせてるだけなので、インスタンスが無いと実行出来ない。
  28. void (Foo::*m)(int) = &Foo::methodA;
  29.  
  30. // なのでインスタンスを用意する
  31. Foo f1(100);
  32. Foo *p1 = &f1;
  33.  
  34. // 結局インスタンスを用意しないと実行出来ないので、
  35. // 同じメンバ関数ポインタを集めたリストがあっても意味無いが…
  36.  
  37. (f1.*m)(10); // 自動変数から
  38. (p1->*m)(20); // ポインタから
  39.  
  40.  
  41. // -------------------------------------------------------------------------------------------
  42. typedef void (Foo::*MethodPtr)(int); // 見づらいので typedef
  43. typedef std::vector<MethodPtr> MethodList;
  44.  
  45. MethodList list;
  46. list.push_back(&Foo::methodA);
  47. list.push_back(&Foo::methodB);
  48.  
  49. Foo f2(1000);
  50.  
  51. // 同じインスタンスにある複数のメソッドを実行したい
  52. // って話ならありかもと思った
  53.  
  54. for(
  55. MethodList::iterator it = list.begin()
  56. ; it != list.end()
  57. ; ++it
  58. ) {
  59. (f2.*(*it))(11);
  60. }
  61.  
  62. return 0;
  63. }
  64.  
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
add: 110
add: 130
add: 1011
minus: 1000