#include <iostream>
#include <utility>
#include <tuple>


template <typename ... Args>
void f(Args... args)
{
	int dummy[] = {0, (std::cout << " " << std::forward<Args>(args), 0)...};
}

namespace detail
{
	
	template<std::size_t I>
	struct impl
	{
		template <typename TUPLE>
		auto operator() (TUPLE&& t) { return std::get<I>(t); }
	};
	
	template<>
	struct impl<2>
	{
		template <typename TUPLE>
		auto operator() (TUPLE&& t) { return std::get<2>(t) + 40; }
	};

	template <std::size_t... Is, typename TUPLE>
	void bar(std::index_sequence<Is...>, TUPLE&& Tuple) {
		return f(impl<Is>{}(std::forward<TUPLE>(Tuple))...);
	}

}

template<typename... Args>
void bar(Args... args) {
    detail::bar(std::index_sequence_for<Args...>(), std::forward_as_tuple(args...));
}

int main() {
	bar(0, 1, 2, 3, 4, 5, 6);
	
}