#include <iostream>
#include <functional>
class A {
public:
void foo (int x) { std::cout << "A::foo(" << x << ")\n"; }
};
class B {
public:
void foo (int x) { std::cout << "B::foo(" << x << ")\n"; }
};
// Variante 1: std::bind
void test1 () {
// Instanzen der Klassen
A a;
B b;
// "Polymorpher" Funktionspointer
std::function<void(int)> fun;
// Weise A::foo zu, mit Instanz a
fun = std::bind (&A::foo, &a, std::placeholders::_1);
// Rufe auf
fun (42);
// Weise B::foo zu, mit Instanz b
fun = std::bind (&B::foo, &b, std::placeholders::_1);
// Rufe auf
fun (84);
}
// Variante 2: Lambda
void test2 () {
// Instanzen der Klassen
A a;
B b;
// "Polymorpher" Funktionspointer
std::function<void(int)> fun;
// Weise A::foo zu, mit Instanz a
fun = [&a] (int x) { a.foo (x); };
// Rufe auf
fun (42);
// Weise B::foo zu, mit Instanz b
fun = [&b] (int x) { b.foo (x); };
// Rufe auf
fun (84);
}
int main() {
test1 ();
test2 ();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCmNsYXNzIEEgewoJcHVibGljOgoJCXZvaWQgZm9vIChpbnQgeCkgeyBzdGQ6OmNvdXQgPDwgIkE6OmZvbygiIDw8IHggPDwgIilcbiI7IH0KfTsKCmNsYXNzIEIgewoJcHVibGljOgoJCXZvaWQgZm9vIChpbnQgeCkgeyBzdGQ6OmNvdXQgPDwgIkI6OmZvbygiIDw8IHggPDwgIilcbiI7IH0KfTsKCi8vIFZhcmlhbnRlIDE6IHN0ZDo6YmluZAp2b2lkIHRlc3QxICgpIHsKCS8vIEluc3RhbnplbiBkZXIgS2xhc3NlbgoJQSBhOwoJQiBiOwoJCgkvLyAiUG9seW1vcnBoZXIiIEZ1bmt0aW9uc3BvaW50ZXIKCXN0ZDo6ZnVuY3Rpb248dm9pZChpbnQpPiBmdW47CgkKCS8vIFdlaXNlIEE6OmZvbyB6dSwgbWl0IEluc3RhbnogYQoJZnVuID0gc3RkOjpiaW5kICgmQTo6Zm9vLCAmYSwgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKTsKCQoJLy8gUnVmZSBhdWYKCWZ1biAoNDIpOwoJCgkvLyBXZWlzZSBCOjpmb28genUsIG1pdCBJbnN0YW56IGIKCWZ1biA9IHN0ZDo6YmluZCAoJkI6OmZvbywgJmIsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSk7CgkKCS8vIFJ1ZmUgYXVmCglmdW4gKDg0KTsKfQoKLy8gVmFyaWFudGUgMjogTGFtYmRhCnZvaWQgdGVzdDIgKCkgewoJLy8gSW5zdGFuemVuIGRlciBLbGFzc2VuCglBIGE7CglCIGI7CgkKCS8vICJQb2x5bW9ycGhlciIgRnVua3Rpb25zcG9pbnRlcgoJc3RkOjpmdW5jdGlvbjx2b2lkKGludCk+IGZ1bjsKCQoJLy8gV2Vpc2UgQTo6Zm9vIHp1LCBtaXQgSW5zdGFueiBhCglmdW4gPSBbJmFdIChpbnQgeCkgeyBhLmZvbyAoeCk7IH07CgkKCS8vIFJ1ZmUgYXVmCglmdW4gKDQyKTsKCQoJLy8gV2Vpc2UgQjo6Zm9vIHp1LCBtaXQgSW5zdGFueiBiCglmdW4gPSBbJmJdIChpbnQgeCkgeyBiLmZvbyAoeCk7IH07CgkKCS8vIFJ1ZmUgYXVmCglmdW4gKDg0KTsKfQoKaW50IG1haW4oKSB7Cgl0ZXN0MSAoKTsKCXRlc3QyICgpOwoJcmV0dXJuIDA7Cn0=