#include <stdio.h>
#include <vector>
class Foo
{
int val;
public:
Foo(int x): val(x) {}
~Foo() {}
void methodA(int a)
{
val += a;
printf("add: %d\r\n", val);
}
void methodB(int a)
{
val -= a;
printf("minus: %d\r\n", val);
}
};
int main()
{
// -------------------------------------------------------------------------------------------
// メンバ関数のポインタを持たせてるだけなので、インスタンスが無いと実行出来ない。
void (Foo::*m)(int) = &Foo::methodA;
// なのでインスタンスを用意する
Foo f1(100);
Foo *p1 = &f1;
// 結局インスタンスを用意しないと実行出来ないので、
// 同じメンバ関数ポインタを集めたリストがあっても意味無いが…
(f1.*m)(10); // 自動変数から
(p1->*m)(20); // ポインタから
// -------------------------------------------------------------------------------------------
typedef void (Foo::*MethodPtr)(int); // 見づらいので typedef
typedef std::vector<MethodPtr> MethodList;
MethodList list;
list.push_back(&Foo::methodA);
list.push_back(&Foo::methodB);
Foo f2(1000);
// 同じインスタンスにある複数のメソッドを実行したい
// って話ならありかもと思った
for(
MethodList::iterator it = list.begin()
; it != list.end()
; ++it
) {
(f2.*(*it))(11);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx2ZWN0b3I+CgpjbGFzcyBGb28KewoJaW50IHZhbDsKcHVibGljOgoJRm9vKGludCB4KTogdmFsKHgpIHt9Cgl+Rm9vKCkge30KCgl2b2lkIG1ldGhvZEEoaW50IGEpCgl7CgkJdmFsICs9IGE7CgkJcHJpbnRmKCJhZGQ6ICVkXHJcbiIsIHZhbCk7Cgl9CgoJdm9pZCBtZXRob2RCKGludCBhKQoJewoJCXZhbCAtPSBhOwoJCXByaW50ZigibWludXM6ICVkXHJcbiIsIHZhbCk7Cgl9Cn07CgppbnQgbWFpbigpCnsKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIOODoeODs+ODkOmWouaVsOOBruODneOCpOODs+OCv+OCkuaMgeOBn+OBm+OBpuOCi+OBoOOBkeOBquOBruOBp+OAgeOCpOODs+OCueOCv+ODs+OCueOBjOeEoeOBhOOBqOWun+ihjOWHuuadpeOBquOBhOOAggoJdm9pZCAoRm9vOjoqbSkoaW50KSA9ICZGb286Om1ldGhvZEE7CgoJLy8g44Gq44Gu44Gn44Kk44Oz44K544K/44Oz44K544KS55So5oSP44GZ44KLCglGb28gZjEoMTAwKTsKCUZvbyAqcDEgPSAmZjE7CgoJLy8g57WQ5bGA44Kk44Oz44K544K/44Oz44K544KS55So5oSP44GX44Gq44GE44Go5a6f6KGM5Ye65p2l44Gq44GE44Gu44Gn44CBCgkvLyDlkIzjgZjjg6Hjg7Pjg5DplqLmlbDjg53jgqTjg7Pjgr/jgpLpm4bjgoHjgZ/jg6rjgrnjg4jjgYzjgYLjgaPjgabjgoLmhI/lkbPnhKHjgYTjgYzigKYKCgkoZjEuKm0pKDEwKTsJLy8g6Ieq5YuV5aSJ5pWw44GL44KJCgkocDEtPiptKSgyMCk7CS8vIOODneOCpOODs+OCv+OBi+OCiQoKCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgl0eXBlZGVmIHZvaWQgKEZvbzo6Kk1ldGhvZFB0cikoaW50KTsJCS8vIOimi+OBpeOCieOBhOOBruOBpyB0eXBlZGVmCgl0eXBlZGVmIHN0ZDo6dmVjdG9yPE1ldGhvZFB0cj4gTWV0aG9kTGlzdDsKCglNZXRob2RMaXN0IGxpc3Q7CglsaXN0LnB1c2hfYmFjaygmRm9vOjptZXRob2RBKTsKCWxpc3QucHVzaF9iYWNrKCZGb286Om1ldGhvZEIpOwoKCUZvbyBmMigxMDAwKTsKCgkvLyDlkIzjgZjjgqTjg7Pjgrnjgr/jg7PjgrnjgavjgYLjgovopIfmlbDjga7jg6Hjgr3jg4Pjg4njgpLlrp/ooYzjgZfjgZ/jgYQKCS8vIOOBo+OBpuipseOBquOCieOBguOCiuOBi+OCguOBqOaAneOBo+OBnwoKCWZvcigKCQlNZXRob2RMaXN0OjppdGVyYXRvciBpdCA9IGxpc3QuYmVnaW4oKQoJCTsgaXQgIT0gbGlzdC5lbmQoKQoJCTsgKytpdAoJKSB7CgkJKGYyLiooKml0KSkoMTEpOwoJfQoKCXJldHVybiAwOwp9Cg==