#include <iostream>
template <typename F>
struct Foo {
Foo(F&& f) : f(std::forward<F>(f)) {}
template<typename... Arguments>
void execute(Arguments... args) {
f(args ...);
}
protected:
F f;
};
template <typename F>
Foo<F> make_foo(F&& f = F()) { return {f}; }
void padd(int a, int b) { std::cout << a + b << std::endl; }
void psub(int a, int b) { std::cout << a - b << std::endl; }
int main() {
auto f = make_foo(padd);
f.execute(5, 6);
make_foo(psub).execute(5, 6);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgogCnRlbXBsYXRlIDx0eXBlbmFtZSBGPgpzdHJ1Y3QgRm9vIHsKICAgIEZvbyhGJiYgZikgOiBmKHN0ZDo6Zm9yd2FyZDxGPihmKSkge30KCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVudHM+CiAgICB2b2lkIGV4ZWN1dGUoQXJndW1lbnRzLi4uIGFyZ3MpIHsKICAgICAgICBmKGFyZ3MgLi4uKTsKICAgIH0KCiAgcHJvdGVjdGVkOgogICAgRiBmOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIEY+CiAgRm9vPEY+IG1ha2VfZm9vKEYmJiBmID0gRigpKSB7IHJldHVybiB7Zn07IH0KIAp2b2lkIHBhZGQoaW50IGEsIGludCBiKSB7IHN0ZDo6Y291dCA8PCBhICsgYiA8PCBzdGQ6OmVuZGw7IH0Kdm9pZCBwc3ViKGludCBhLCBpbnQgYikgeyBzdGQ6OmNvdXQgPDwgYSAtIGIgPDwgc3RkOjplbmRsOyB9CiAKaW50IG1haW4oKSB7CiAgICBhdXRvIGYgPSBtYWtlX2ZvbyhwYWRkKTsKICAgIGYuZXhlY3V0ZSg1LCA2KTsKCiAgICBtYWtlX2Zvbyhwc3ViKS5leGVjdXRlKDUsIDYpOwogCiAgICByZXR1cm4gMDsKfQo=