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

using namespace std;

namespace detail {
    template<class F, class...Args>
    void for_each_arg(F&& f, Args&&...args) {
        using detail = int[];

        static_cast<void>(detail{((f(std::forward<Args>(args))), void(), 0)..., 0});
    }
}

template <typename F, typename Tuple>
void for_each_tuple_element(F&& f, Tuple&& t) {
    return experimental::apply([&](auto&&...args) { detail::for_each_arg(forward<F>(f), decltype(args)(args)... ); }, forward<Tuple>(t));	
}

int main(){
	for_each_tuple_element([](const auto& i){cout << i << ' ';}, make_tuple(3.14, "hello", -1));
}