#include <iostream>
#include <functional>
using namespace std;
typedef std::function<void()> CallBack;
class TestChangeCallback
{
public:
void Do(const int& a)
{
cout << "Before: " << a << endl;
m_Callback = std::bind(&TestChangeCallback::Do, this, 2);
cout << "After: " << a << endl;
}
void Invoke()
{
cout << __FUNCTION__ << " start " << bool(m_Callback)<< endl;
if (m_Callback)
{
m_Callback();
}
cout << __FUNCTION__ << " end " << bool(m_Callback)<< endl;
}
CallBack m_Callback;
};
int main() {
TestChangeCallback test;
test.m_Callback = std::bind(&TestChangeCallback::Do, &test, 1);
test.Invoke();
cout << __FUNCTION__ << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBDYWxsQmFjazsKCmNsYXNzIFRlc3RDaGFuZ2VDYWxsYmFjawp7CnB1YmxpYzoKCXZvaWQgRG8oY29uc3QgaW50JiBhKQoJewoJCWNvdXQgPDwgIkJlZm9yZTogIiAgPDwgYSA8PCBlbmRsOwoJCW1fQ2FsbGJhY2sgPSBzdGQ6OmJpbmQoJlRlc3RDaGFuZ2VDYWxsYmFjazo6RG8sIHRoaXMsIDIpOwoJCWNvdXQgPDwgIkFmdGVyOiAiICA8PCBhIDw8IGVuZGw7Cgl9CgoJdm9pZCBJbnZva2UoKQoJewoJCWNvdXQgPDwgX19GVU5DVElPTl9fIDw8ICIgc3RhcnQgIiA8PCBib29sKG1fQ2FsbGJhY2spPDwgZW5kbDsKCQlpZiAobV9DYWxsYmFjaykKCQl7CgkJCW1fQ2FsbGJhY2soKTsKCQl9CgkJY291dCA8PCBfX0ZVTkNUSU9OX18gPDwgIiBlbmQgIiA8PCBib29sKG1fQ2FsbGJhY2spPDwgZW5kbDsKCX0KCglDYWxsQmFjayBtX0NhbGxiYWNrOwp9OwoKaW50IG1haW4oKSB7CglUZXN0Q2hhbmdlQ2FsbGJhY2sgdGVzdDsKCgl0ZXN0Lm1fQ2FsbGJhY2sgPSBzdGQ6OmJpbmQoJlRlc3RDaGFuZ2VDYWxsYmFjazo6RG8sICZ0ZXN0LCAxKTsKCXRlc3QuSW52b2tlKCk7Cgljb3V0IDw8IF9fRlVOQ1RJT05fXyA8PCBlbmRsOwoKCXJldHVybiAwOwp9Cg==