#include <iostream>
#include <functional>
template<typename F, typename C>
auto smart_bind(F f, C* c)
{
return [c, f](auto&&... args) { return (c->*f)(std::forward<decltype(args)>(args)...); };
}
struct Foo
{
int bar(int i, float f, bool b)
{
return b ? i : f;
}
double sum(double x, double y)
{
return x + y;
}
void print(int x)
{
std::cout << x << std::endl;
}
};
int main()
{
Foo object;
std::function<int(int, float, bool)> f1 = smart_bind(&Foo::bar, &object);
std::function<double(double, double)> f2 = smart_bind(&Foo::sum, &object);
std::function<void(int)> f3 = smart_bind(&Foo::print, &object);
std::cout << f1(100, 150.32, true) << std::endl;
std::cout << f2(1.0, 2.0) << std::endl;
f3(42);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnRlbXBsYXRlPHR5cGVuYW1lIEYsIHR5cGVuYW1lIEM+CmF1dG8gc21hcnRfYmluZChGIGYsIEMqIGMpCnsKICByZXR1cm4gW2MsIGZdKGF1dG8mJi4uLiBhcmdzKSB7IHJldHVybiAoYy0+KmYpKHN0ZDo6Zm9yd2FyZDxkZWNsdHlwZShhcmdzKT4oYXJncykuLi4pOyB9Owp9CgpzdHJ1Y3QgRm9vCnsKICBpbnQgYmFyKGludCBpLCBmbG9hdCBmLCBib29sIGIpCiAgewogICAgcmV0dXJuIGIgPyBpIDogZjsKICB9CiAgZG91YmxlIHN1bShkb3VibGUgeCwgZG91YmxlIHkpCiAgewogICAgcmV0dXJuIHggKyB5OwogIH0KICB2b2lkIHByaW50KGludCB4KQogIHsKICAgIHN0ZDo6Y291dCA8PCB4IDw8IHN0ZDo6ZW5kbDsKICB9Cn07CgppbnQgbWFpbigpCnsKICBGb28gb2JqZWN0OwogIHN0ZDo6ZnVuY3Rpb248aW50KGludCwgZmxvYXQsIGJvb2wpPiBmMSA9IHNtYXJ0X2JpbmQoJkZvbzo6YmFyLCAmb2JqZWN0KTsKICBzdGQ6OmZ1bmN0aW9uPGRvdWJsZShkb3VibGUsIGRvdWJsZSk+IGYyID0gc21hcnRfYmluZCgmRm9vOjpzdW0sICZvYmplY3QpOwogIHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQpPiBmMyA9IHNtYXJ0X2JpbmQoJkZvbzo6cHJpbnQsICZvYmplY3QpOwoKICBzdGQ6OmNvdXQgPDwgZjEoMTAwLCAxNTAuMzIsIHRydWUpIDw8IHN0ZDo6ZW5kbDsKICBzdGQ6OmNvdXQgPDwgZjIoMS4wLCAyLjApIDw8IHN0ZDo6ZW5kbDsKICBmMyg0Mik7Cn0K