#include <iostream>
using namespace std;
class Test {
int m;
public:
Test(int i = 0):m(i){}
void func1() const { cout << "Test::func1, m = " << m << "\n"; }
void func2() const { cout << "Test::func2, m = " << m << "\n"; }
};
// Тип testfunc - указатель на функцию-член Test
typedef void (Test::*testfunc)() const;
// Вызов для объекта tets функции f
void out(const Test& t, testfunc f)
{
(t.*f)();
}
void outPtr(const Test* t, testfunc f)
{
(t->*f)();
}
int main() {
Test a(1), b(2);
out(a,&Test::func1);
out(b,&Test::func2);
outPtr(&a,&Test::func2);
outPtr(&b,&Test::func1);
}
I2luY2x1ZGUgPGlvc3RyZWFtPiAgCiAgCnVzaW5nIG5hbWVzcGFjZSBzdGQ7ICAKICAKY2xhc3MgVGVzdCB7CiAgICBpbnQgbTsKcHVibGljOgogICAgVGVzdChpbnQgaSA9IDApOm0oaSl7fQogICAgdm9pZCBmdW5jMSgpIGNvbnN0IHsgY291dCA8PCAiVGVzdDo6ZnVuYzEsIG0gPSAiIDw8IG0gPDwgIlxuIjsgfQogICAgdm9pZCBmdW5jMigpIGNvbnN0IHsgY291dCA8PCAiVGVzdDo6ZnVuYzIsIG0gPSAiIDw8IG0gPDwgIlxuIjsgfQp9OwoKCi8vINCi0LjQvyAgdGVzdGZ1bmMgLSDRg9C60LDQt9Cw0YLQtdC70Ywg0L3QsCDRhNGD0L3QutGG0LjRji3Rh9C70LXQvSBUZXN0CnR5cGVkZWYgdm9pZCAoVGVzdDo6KnRlc3RmdW5jKSgpIGNvbnN0OwoKLy8g0JLRi9C30L7QsiDQtNC70Y8g0L7QsdGK0LXQutGC0LAgdGV0cyDRhNGD0L3QutGG0LjQuCBmCnZvaWQgb3V0KGNvbnN0IFRlc3QmIHQsIHRlc3RmdW5jIGYpCnsKICAgICh0LipmKSgpOwp9Cgp2b2lkIG91dFB0cihjb25zdCBUZXN0KiB0LCB0ZXN0ZnVuYyBmKQp7CiAgICAodC0+KmYpKCk7Cn0KCmludCBtYWluKCkgewoKICAgIFRlc3QgYSgxKSwgYigyKTsKICAgIG91dChhLCZUZXN0OjpmdW5jMSk7CiAgICBvdXQoYiwmVGVzdDo6ZnVuYzIpOwogICAgb3V0UHRyKCZhLCZUZXN0OjpmdW5jMik7CiAgICBvdXRQdHIoJmIsJlRlc3Q6OmZ1bmMxKTsKfSAgCgo=