#include <functional>
#include <iostream>
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>
struct Foo {
template <typename Ft, typename... Arguments>
void execute(Ft ff, Arguments... args) {
T d(3);
std::function<void(T&, Arguments...)> f = ff;
f(d, args ...);
}
};
int main() {
auto b = Foo<Bar>();
b.execute(&Bar::add, 4, 5);
return 0;
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KIApzdHJ1Y3QgQmFyIHsKICAgIGludCB6OwogCiAgICAgICAgQmFyKGludCB6KSA6IHooeikge30KIAogICAgICAgIHZvaWQgYWRkKGludCB4LCBpbnQgeSkgeyBzdGQ6OmNvdXQgPDwgeCArIHkgKyB6IDw8IHN0ZDo6ZW5kbDsgfQp9OwogCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgRm9vIHsKICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnQsIHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KICAgICAgICB2b2lkIGV4ZWN1dGUoRnQgZmYsIEFyZ3VtZW50cy4uLiBhcmdzKSB7CiAgICAgICAgICAgICAgICBUIGQoMyk7CiAKICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChUJiwgQXJndW1lbnRzLi4uKT4gZiA9IGZmOwogICAgICAgICAgICAgICAgZihkLCBhcmdzIC4uLik7CiAgICAgICAgfQp9OwogCmludCBtYWluKCkgewogICAgICAgIGF1dG8gYiA9IEZvbzxCYXI+KCk7CiAgICAgICAgYi5leGVjdXRlKCZCYXI6OmFkZCwgNCwgNSk7CiAKICAgICAgICByZXR1cm4gMDsKfQo=