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