#include <iostream>
#include <list>
#include <utility>
#include <vector>
template <typename F> struct arity;
template <typename Ret, typename ...Args> struct arity<Ret(Args...)>
{
static constexpr std::size_t value = sizeof...(Args);
};
template <typename Func, typename T, std::size_t ... Is>
decltype(auto) apply(Func&& f, const std::list<T>& pars, std::index_sequence<Is...>)
{
std::vector<T> v(pars.rbegin(), pars.rend());
return std::forward<Func>(f)(v.at(Is)...);
}
template <typename Func, typename T>
decltype(auto) apply(Func&& f, const std::list<T>& pars)
{
constexpr std::size_t N = arity<std::remove_pointer_t<std::decay_t<Func>>>::value;
return apply(std::forward<Func>(f), pars, std::make_index_sequence<N>());
}
void print(int a, int b, int c, int d, int e, int f)
{
std::cout << a << " " << b << " "<< c << " "<< d << " "<< e << " "<< f << std::endl;
}
int main()
{
const std::list<int> l{4, 8, 15, 16, 23, 42};
apply(print, l);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDx2ZWN0b3I+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gc3RydWN0IGFyaXR5OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFJldCwgdHlwZW5hbWUgLi4uQXJncz4gc3RydWN0IGFyaXR5PFJldChBcmdzLi4uKT4KewogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnNpemVfdCB2YWx1ZSA9IHNpemVvZi4uLihBcmdzKTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCAuLi4gSXM+CmRlY2x0eXBlKGF1dG8pIGFwcGx5KEZ1bmMmJiBmLCBjb25zdCBzdGQ6Omxpc3Q8VD4mIHBhcnMsIHN0ZDo6aW5kZXhfc2VxdWVuY2U8SXMuLi4+KQp7CiAgICBzdGQ6OnZlY3RvcjxUPiB2KHBhcnMucmJlZ2luKCksIHBhcnMucmVuZCgpKTsKCiAgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxGdW5jPihmKSh2LmF0KElzKS4uLik7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBUPgpkZWNsdHlwZShhdXRvKSBhcHBseShGdW5jJiYgZiwgY29uc3Qgc3RkOjpsaXN0PFQ+JiBwYXJzKQp7CiAgICBjb25zdGV4cHIgc3RkOjpzaXplX3QgTiA9IGFyaXR5PHN0ZDo6cmVtb3ZlX3BvaW50ZXJfdDxzdGQ6OmRlY2F5X3Q8RnVuYz4+Pjo6dmFsdWU7CiAgICByZXR1cm4gYXBwbHkoc3RkOjpmb3J3YXJkPEZ1bmM+KGYpLCBwYXJzLCBzdGQ6Om1ha2VfaW5kZXhfc2VxdWVuY2U8Tj4oKSk7Cn0KCnZvaWQgcHJpbnQoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQsIGludCBlLCBpbnQgZikKewogICAgc3RkOjpjb3V0IDw8IGEgPDwgIiAiIDw8IGIgPDwgIiAiPDwgYyA8PCAiICI8PCBkIDw8ICIgIjw8IGUgPDwgIiAiPDwgZiA8PCBzdGQ6OmVuZGw7Cn0KCmludCBtYWluKCkKewogICAgY29uc3Qgc3RkOjpsaXN0PGludD4gbHs0LCA4LCAxNSwgMTYsIDIzLCA0Mn07CiAgICAKICAgIGFwcGx5KHByaW50LCBsKTsKfQo=