#include <iostream>
#include <functional>
class A{
private:
int id;
public:
A(int id) : id(id){};
void display_id(){ std::cout << "id:" << id << std::endl; }
};
class B{
public:
A *a;
std::function<void()> f;
public:
B(A *a): a(a){}
void set_callback(std::function<void()> f_){
f = f_;
}
void invoke_callback(){
f();
}
};
int main(){
A a{5};
B b{&a};
// auto f = ;
b.f = [&](){ std::cout << "hello!" << std::endl; a.display_id(); };
b.invoke_callback();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCmNsYXNzIEF7CnByaXZhdGU6CiAgICBpbnQgaWQ7CnB1YmxpYzoKICAgIEEoaW50IGlkKSA6IGlkKGlkKXt9OwogICAgdm9pZCBkaXNwbGF5X2lkKCl7IHN0ZDo6Y291dCA8PCAiaWQ6IiA8PCBpZCA8PCBzdGQ6OmVuZGw7IH0KfTsKCmNsYXNzIEJ7CnB1YmxpYzoKICAgIEEgKmE7CiAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZjsKcHVibGljOgogICAgQihBICphKTogYShhKXt9CiAgICB2b2lkIHNldF9jYWxsYmFjayhzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZl8pewogICAgICAgIGYgPSBmXzsKICAgIH0KICAgIHZvaWQgaW52b2tlX2NhbGxiYWNrKCl7CiAgICAgICAgZigpOwogICAgfQp9OwoKaW50IG1haW4oKXsKICAgIEEgYXs1fTsKICAgIEIgYnsmYX07CiAgICAvLyBhdXRvIGYgPSA7CiAgICBiLmYgPSBbJl0oKXsgc3RkOjpjb3V0IDw8ICJoZWxsbyEiIDw8IHN0ZDo6ZW5kbDsgYS5kaXNwbGF5X2lkKCk7IH07CiAgICBiLmludm9rZV9jYWxsYmFjaygpOwoKICAgIHJldHVybiAwOwp9