#include <iostream>
#include <tuple>
#include <type_traits>
using namespace std;
template <typename Fnc, typename ... Types, std::size_t ... Indices>
auto apply_impl(Fnc &&fnc, const std::tuple<Types...> &tuple, std::index_sequence<Indices...>)
{
return std::forward<Fnc>(fnc)(std::get<Indices>(tuple)...);
}
template <typename Fnc, typename ... Types>
auto apply(Fnc &&fnc, const std::tuple<Types...> &tuple)
{
return apply_impl(std::forward<Fnc>(fnc), tuple, std::index_sequence_for<Types...>());
}
void foo(int a, float b, char c)
{
std::cout << a << ' ' << b << ' ' << c << '\n';
}
int main()
{
auto tuple = std::make_tuple(4, 3.12, 'A');
apply(foo, tuple);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBGbmMsIHR5cGVuYW1lIC4uLiBUeXBlcywgc3RkOjpzaXplX3QgLi4uIEluZGljZXM+CmF1dG8gYXBwbHlfaW1wbChGbmMgJiZmbmMsIGNvbnN0IHN0ZDo6dHVwbGU8VHlwZXMuLi4+ICZ0dXBsZSwgc3RkOjppbmRleF9zZXF1ZW5jZTxJbmRpY2VzLi4uPikKewoJcmV0dXJuIHN0ZDo6Zm9yd2FyZDxGbmM+KGZuYykoc3RkOjpnZXQ8SW5kaWNlcz4odHVwbGUpLi4uKTsJCn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBGbmMsIHR5cGVuYW1lIC4uLiBUeXBlcz4KYXV0byBhcHBseShGbmMgJiZmbmMsIGNvbnN0IHN0ZDo6dHVwbGU8VHlwZXMuLi4+ICZ0dXBsZSkKewoJcmV0dXJuIGFwcGx5X2ltcGwoc3RkOjpmb3J3YXJkPEZuYz4oZm5jKSwgdHVwbGUsIHN0ZDo6aW5kZXhfc2VxdWVuY2VfZm9yPFR5cGVzLi4uPigpKTsKfQoKdm9pZCBmb28oaW50IGEsIGZsb2F0IGIsIGNoYXIgYykKewoJc3RkOjpjb3V0IDw8IGEgPDwgJyAnIDw8IGIgPDwgJyAnIDw8IGMgPDwgJ1xuJzsKfQoKaW50IG1haW4oKQp7CglhdXRvIHR1cGxlID0gc3RkOjptYWtlX3R1cGxlKDQsIDMuMTIsICdBJyk7CglhcHBseShmb28sIHR1cGxlKTsKfQ==