#include <iostream>
#include <functional>
struct Bar {
int z;
Bar(int z) : z(z) {}
void add(int x, int y) { std::cout << x + y + z << std::endl; }
};
template <typename T, typename... Arguments>
struct Foo {
std::function<void(T&, Arguments ...)> f;
template <typename F> Foo(F&& f) : f(std::forward<F>(f)) {}
void execute(Arguments ... args) {
T c(2);
f(c, args ...);
}
};
int main() {
auto b = Foo<Bar, int, int>(&Bar::add);
b.execute(4, 5);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnN0cnVjdCBCYXIgewogICAgaW50IHo7CgoJQmFyKGludCB6KSA6IHooeikge30KCgl2b2lkIGFkZChpbnQgeCwgaW50IHkpIHsgc3RkOjpjb3V0IDw8IHggKyB5ICsgeiA8PCBzdGQ6OmVuZGw7IH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmd1bWVudHM+CnN0cnVjdCBGb28gewoJc3RkOjpmdW5jdGlvbjx2b2lkKFQmLCBBcmd1bWVudHMgLi4uKT4gZjsKCgl0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gRm9vKEYmJiBmKSA6IGYoc3RkOjpmb3J3YXJkPEY+KGYpKSB7fQoKCXZvaWQgZXhlY3V0ZShBcmd1bWVudHMgLi4uIGFyZ3MpIHsKCQlUIGMoMik7CgkJZihjLCBhcmdzIC4uLik7Cgl9Cn07CgppbnQgbWFpbigpIHsKCWF1dG8gYiA9IEZvbzxCYXIsIGludCwgaW50PigmQmFyOjphZGQpOwoJYi5leGVjdXRlKDQsIDUpOwoKCXJldHVybiAwOwp9