#include <iostream>
#include <functional> // C++11
//#include <boost/function.hpp>
//#include <boost/bind.hpp>
struct A{
std::function<void(int)> callback;
void invoke(){ callback(42); }
};
struct B{
void foo(int data){ std::cout << data * 2 << "\n"; }
};
struct C{
void bar(int data){ std::cout << data / 2 << "\n"; }
};
int main(){
using namespace std::placeholders; // namespace for argument placeholders for std::bind
// not needed for Boost.Bind
A a;
B b;
a.callback = std::bind(&B::foo, &b, _1);
a.invoke();
C c;
a.callback = std::bind(&C::bar, &c, _1);
a.invoke();
};
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4gLy8gQysrMTEKLy8jaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgovLyNpbmNsdWRlIDxib29zdC9iaW5kLmhwcD4KCnN0cnVjdCBBewogIHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQpPiBjYWxsYmFjazsKICB2b2lkIGludm9rZSgpeyBjYWxsYmFjayg0Mik7IH0KfTsKCnN0cnVjdCBCewogIHZvaWQgZm9vKGludCBkYXRhKXsgc3RkOjpjb3V0IDw8IGRhdGEgKiAyIDw8ICJcbiI7IH0KfTsKCnN0cnVjdCBDewogIHZvaWQgYmFyKGludCBkYXRhKXsgc3RkOjpjb3V0IDw8IGRhdGEgLyAyIDw8ICJcbiI7IH0KfTsKCmludCBtYWluKCl7CiAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6cGxhY2Vob2xkZXJzOyAvLyBuYW1lc3BhY2UgZm9yIGFyZ3VtZW50IHBsYWNlaG9sZGVycyBmb3Igc3RkOjpiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgbmVlZGVkIGZvciBCb29zdC5CaW5kCiAgQSBhOwogIEIgYjsKICBhLmNhbGxiYWNrID0gc3RkOjpiaW5kKCZCOjpmb28sICZiLCBfMSk7CiAgYS5pbnZva2UoKTsKICBDIGM7CiAgYS5jYWxsYmFjayA9IHN0ZDo6YmluZCgmQzo6YmFyLCAmYywgXzEpOwogIGEuaW52b2tlKCk7Cn07