#include <functional>
#include <iostream>
#include <tuple>
#include <type_traits>
#include <utility>

using namespace std;

template <typename Tuple, typename F, size_t begin, size_t end>
enable_if_t<begin == end || tuple_size<Tuple>::value < end> for_each(Tuple&, F&&) {
}

template <typename Tuple, typename F, size_t begin = 0U, size_t end = tuple_size<Tuple>::value>
enable_if_t<begin < end && tuple_size<Tuple>::value >= end> for_each(Tuple& t, F&& f) {
	f(get<begin>(t));
	for_each<Tuple, F, begin + 1, end>(t, forward<F>(f));
}



int main() {
	auto t = make_tuple(3.14, "Hello World!", -1);
	auto f = [](const auto& i) { cout << i; };

	for_each<decltype(t), decltype(f), 1>(t, forward<decltype(f)>(f));
}