#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);
}