#include <iostream>
#include <memory>
#include <string>
class Foo : public std::enable_shared_from_this<Foo> {
public:
Foo(const std::string& i_name) : name(i_name) {}
std::function<void()> GetPrinter() {
std::shared_ptr<Foo> that = shared_from_this();
return [that]() {
std::cout << that->name << std::endl;
};
}
std::string name;
};
int main() {
std::function<void()> f;
{
auto foo = std::make_shared<Foo>("OK");
f = foo->GetPrinter();
}
auto foo = std::make_shared<Foo>("WRONG");
f();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8c3RyaW5nPgoKY2xhc3MgRm9vIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8Rm9vPiB7CnB1YmxpYzoKCUZvbyhjb25zdCBzdGQ6OnN0cmluZyYgaV9uYW1lKSA6IG5hbWUoaV9uYW1lKSB7fQoJCglzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gR2V0UHJpbnRlcigpIHsKCQlzdGQ6OnNoYXJlZF9wdHI8Rm9vPiB0aGF0ID0gc2hhcmVkX2Zyb21fdGhpcygpOwoJCQoJCXJldHVybiBbdGhhdF0oKSB7CgkJCXN0ZDo6Y291dCA8PCB0aGF0LT5uYW1lIDw8IHN0ZDo6ZW5kbDsKCQl9OwoJfQoKCXN0ZDo6c3RyaW5nIG5hbWU7Cn07CgppbnQgbWFpbigpIHsKCXN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBmOwoJCgl7CgkJYXV0byBmb28gPSBzdGQ6Om1ha2Vfc2hhcmVkPEZvbz4oIk9LIik7CgkJZiA9IGZvby0+R2V0UHJpbnRlcigpOwoJfQoJCglhdXRvIGZvbyA9IHN0ZDo6bWFrZV9zaGFyZWQ8Rm9vPigiV1JPTkciKTsKCQoJZigpOwoJCglyZXR1cm4gMDsKfQo=