#include <iostream>
template<typename R, typename... Args>
auto foo( R (*bar)(Args...), Args... args)
{
return bar(std::forward<Args>(args)...);
}
template<typename F, typename... Args>
auto foo( F f, Args... args)
{
return foo(+f, std::forward<Args>(args)...);
}
int main()
{
foo([](int x, float y)
{
std::cout << x << " " << y << std::endl;
},
5, 42.42f
);
return 0;
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgICAKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lLi4uIEFyZ3M+CiAgICBhdXRvIGZvbyggUiAoKmJhcikoQXJncy4uLiksIEFyZ3MuLi4gYXJncykKICAgIHsKICAgIAlyZXR1cm4gYmFyKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CiAgICB9CiAgICAgCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGLCB0eXBlbmFtZS4uLiBBcmdzPgogICAgYXV0byBmb28oIEYgZiwgQXJncy4uLiBhcmdzKQogICAgewogICAgCXJldHVybiBmb28oK2YsIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CiAgICB9CiAgICAKICAgIGludCBtYWluKCkKICAgIHsKICAgIAlmb28oW10oaW50IHgsIGZsb2F0IHkpCiAgICAJICAgICB7CiAgICAJCSAgIHN0ZDo6Y291dCA8PCB4IDw8ICIgIiA8PCB5IDw8IHN0ZDo6ZW5kbDsKICAgIAkJIH0sCiAgICAJCTUsIDQyLjQyZgogICAgCSAgICk7CiAgICAJcmV0dXJuIDA7CiAgICB9