#include <memory>
#include <iostream>
#include <functional>
struct A: std::enable_shared_from_this<A> {
template <typename... Args>
std::function<void(Args...)> functor_from_this(void (A::*method)(Args...)) {
return [=, obj = shared_from_this()](Args... args) {
((*obj).*method)(args...);
};
}
void foo(int) { std::cout << "foo" << '\n'; }
void bar() { std::cout << "bar" << '\n'; }
};
int main()
{
auto a = std::make_shared<A>();
auto f = a->functor_from_this(&A::foo);
auto b = a->functor_from_this(&A::bar);
f(1);
b();
}
CiNpbmNsdWRlIDxtZW1vcnk+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CgpzdHJ1Y3QgQTogc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxBPiB7CgoJdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+CglzdGQ6OmZ1bmN0aW9uPHZvaWQoQXJncy4uLik+IGZ1bmN0b3JfZnJvbV90aGlzKHZvaWQgKEE6OiptZXRob2QpKEFyZ3MuLi4pKSB7CgkgICAgcmV0dXJuIFs9LCBvYmogPSBzaGFyZWRfZnJvbV90aGlzKCldKEFyZ3MuLi4gYXJncykgewoJICAgICAgKCgqb2JqKS4qbWV0aG9kKShhcmdzLi4uKTsKCSAgICB9OwoJfQoKCXZvaWQgZm9vKGludCkgeyBzdGQ6OmNvdXQgPDwgImZvbyIgPDwgJ1xuJzsgfQoJdm9pZCBiYXIoKSB7IHN0ZDo6Y291dCA8PCAiYmFyIiA8PCAnXG4nOyB9Cn07CgppbnQgbWFpbigpCnsKICBhdXRvIGEgPSBzdGQ6Om1ha2Vfc2hhcmVkPEE+KCk7CiAgCiAgYXV0byBmID0gYS0+ZnVuY3Rvcl9mcm9tX3RoaXMoJkE6OmZvbyk7CiAgYXV0byBiID0gYS0+ZnVuY3Rvcl9mcm9tX3RoaXMoJkE6OmJhcik7CiAgCiAgZigxKTsKICBiKCk7Cn0=