将递归转换为循环

Turn recursion into loop

本文关键字:循环 转换 递归      更新时间:2023-10-16

我有一个未知类型的T,可能是不可复制或移动分配的,一个基于现有T计算并返回新的函数T op(const T &foo, Other bar),以及一个递归函数:

template<typename Iter, typename T>
T foldLeft(Iter first, Iter last, const T &z, std::function<T(T, Other)> op)
{
    if (first == last) {
        return z;
    }
    return foldLeft(std::next(first), last, op(z, *first), op);
}

编译器不能总是优化尾部调用,因为T可能有一个重要的析构函数。我正在尝试用循环手动重写它,但无法弄清楚如何重新分配给z.

您可以执行以下操作,但限制很奇怪,使用std::accumulate似乎更简单

template<typename Iter, typename T, typename Fn>
T foldLeft(Iter first, Iter last, const T &z, Fn op)
{
    std::aligned_storage_t<sizeof (T), alignof (T)> buf;
    T* res = new (&buf) T(z);
    for (auto it = first; it != last; ++it) {
        auto&& res2 = op(res, it);
        res->~T();
        res = new (&buf) T(std::move(res2));
    }
    T final_res = *res;
    res->~T();
    return final_res;
}

请注意,它不是异常安全的。