¿Puedo evitar la recursión de plantillas aquí?

He escrito unfor_each paratuples:

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

[Ejemplo en vivo]

PeroLa respuesta de Yakk a esta pregunta da un maravilloso ejemplo de cómo manejar ejecutar una lambda en todostuple valoresno recursivamente:

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

Esto requiereapply. Puedes ver mi simplificación deYakkLa respuesta aquí:http://ideone.com/yAYjmw

Mi pregunta es esta:¿Hay alguna manera de actualizar de alguna manerafor_each_tuple_element con un rango, evitando la recurrencia en la que incurre mi código? He intentado construir el subconjunto detuple definido por el rango, pero parece que no puedo hacer eso sin usar la recursividad, y entonces ¿por qué no solo mifor_each?

Respuestas a la pregunta(4)

Su respuesta a la pregunta