#include <functional>
#include <iostream>
template <typename VAL, typename RET, typename ...ARGS>
struct wrapper_helper
{
static std::function<RET(ARGS...)> wrapper(VAL v)
{
return [&](ARGS...args) -> RET { return v(args...); };
}
};
template <typename VAL, typename ...ARGS>
struct wrapper_helper<VAL,void,ARGS...>
{
static std::function<void(ARGS...)> wrapper(VAL v)
{
return [&](ARGS...args) -> void { v(args...); };
}
};
void print_n(int n){
std::cout << n << std::endl;
}
int main()
{
wrapper_helper<void(int),void,int>::wrapper(print_n)(10);
return 0;
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRlbXBsYXRlIDx0eXBlbmFtZSBWQUwsIHR5cGVuYW1lIFJFVCwgdHlwZW5hbWUgLi4uQVJHUz4Kc3RydWN0IHdyYXBwZXJfaGVscGVyCnsKIHN0YXRpYyBzdGQ6OmZ1bmN0aW9uPFJFVChBUkdTLi4uKT4gd3JhcHBlcihWQUwgdikKIHsKICAgcmV0dXJuIFsmXShBUkdTLi4uYXJncykgLT4gUkVUIHsgcmV0dXJuIHYoYXJncy4uLik7IH07CiB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVkFMLCB0eXBlbmFtZSAuLi5BUkdTPiAKc3RydWN0IHdyYXBwZXJfaGVscGVyPFZBTCx2b2lkLEFSR1MuLi4+CnsKIHN0YXRpYyBzdGQ6OmZ1bmN0aW9uPHZvaWQoQVJHUy4uLik+IHdyYXBwZXIoVkFMIHYpCiB7CiAgIHJldHVybiBbJl0oQVJHUy4uLmFyZ3MpIC0+IHZvaWQgeyB2KGFyZ3MuLi4pOyB9OwogfQp9OwoKdm9pZCBwcmludF9uKGludCBuKXsKCXN0ZDo6Y291dCA8PCBuIDw8IHN0ZDo6ZW5kbDsKfQoKaW50IG1haW4oKQp7CQoJd3JhcHBlcl9oZWxwZXI8dm9pZChpbnQpLHZvaWQsaW50Pjo6d3JhcHBlcihwcmludF9uKSgxMCk7CglyZXR1cm4gMDsKfQ==