#include <iostream>
#include <functional>
template <typename func_t, func_t func>
struct Foo {
template <typename... Arguments>
void execute(Arguments... args) {
func(args ...);
}
};
template <typename T, typename func_t, func_t func>
struct FooMember {
T member;
FooMember(T member) : member(member) {}
template <typename... Arguments>
void execute(Arguments... args) {
std::function<void(T&, Arguments ...)> f(func);
f(this->member, args ...);
}
};
/////////////////////////////////////////////
struct Bar {
int z;
Bar(int z) : z(z) {}
void add(int x, int y) { std::cout << x + y + z << std::endl; }
};
void padd(int x, int y, int z) { std::cout << x + y + z << std::endl; }
int main() {
auto a = Foo<decltype(&padd), &padd>();
auto b = FooMember<Bar, decltype(&Bar::add), &Bar::add>(Bar(2));
a.execute(4, 5, 6); // prints 4+5+6 : 15
b.execute(4, 5); // prints 4+5+a.z : 4+5+2 : 11
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnRlbXBsYXRlIDx0eXBlbmFtZSBmdW5jX3QsIGZ1bmNfdCBmdW5jPgpzdHJ1Y3QgRm9vIHsKICAgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmd1bWVudHM+Cgl2b2lkIGV4ZWN1dGUoQXJndW1lbnRzLi4uIGFyZ3MpIHsKCQlmdW5jKGFyZ3MgLi4uKTsKCX0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBmdW5jX3QsIGZ1bmNfdCBmdW5jPgpzdHJ1Y3QgRm9vTWVtYmVyIHsKCVQgbWVtYmVyOwoKCUZvb01lbWJlcihUIG1lbWJlcikgOiBtZW1iZXIobWVtYmVyKSB7fQoKCXRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmd1bWVudHM+Cgl2b2lkIGV4ZWN1dGUoQXJndW1lbnRzLi4uIGFyZ3MpIHsKCQlzdGQ6OmZ1bmN0aW9uPHZvaWQoVCYsIEFyZ3VtZW50cyAuLi4pPiBmKGZ1bmMpOwoJCWYodGhpcy0+bWVtYmVyLCBhcmdzIC4uLik7Cgl9Cn07CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCnN0cnVjdCBCYXIgewoJaW50IHo7CgoJQmFyKGludCB6KSA6IHooeikge30KCXZvaWQgYWRkKGludCB4LCBpbnQgeSkgeyBzdGQ6OmNvdXQgPDwgeCArIHkgKyB6IDw8IHN0ZDo6ZW5kbDsgfQp9OwoKdm9pZCBwYWRkKGludCB4LCBpbnQgeSwgaW50IHopIHsgc3RkOjpjb3V0IDw8IHggKyB5ICsgeiA8PCBzdGQ6OmVuZGw7IH0KCmludCBtYWluKCkgewoJYXV0byBhID0gRm9vPGRlY2x0eXBlKCZwYWRkKSwgJnBhZGQ+KCk7CglhdXRvIGIgPSBGb29NZW1iZXI8QmFyLCBkZWNsdHlwZSgmQmFyOjphZGQpLCAmQmFyOjphZGQ+KEJhcigyKSk7CgoJYS5leGVjdXRlKDQsIDUsIDYpOyAvLyBwcmludHMgNCs1KzYgOiAxNQoJYi5leGVjdXRlKDQsIDUpOyAvLyBwcmludHMgNCs1K2EueiA6IDQrNSsyIDogMTEKCglyZXR1cm4gMDsKfQo=