c++ - 如何从 lambda 中的函数返回?

标签 c++ lambda return c++11 control-flow

考虑以下玩具代码来确定范围是否包含元素:

template<typename Iter, typename T>
bool contains1(Iter begin, Iter end, const T& x)
{
    for (; begin != end; ++begin)
    {
        if (*begin == x) return true;
    }
    return false;
}

(是的,我知道,标准库中已经有非常好的算法,这不是重点。)

如何使用 for_each 和 lambda 编写相同的内容?以下不起作用...

template<typename Iter, typename T>
bool contains2(Iter begin, Iter end, const T& x)
{
    std::for_each(begin, end, [&x](const T& y) {
        if (x == y) return true;
    });
    return false;
}

...因为那只会从 lambda 中返回,而不是从函数中返回。

我是否必须抛出异常才能退出 lambda?同样,对于这个特定问题,可能有十几个更好的解决方案根本不涉及 lambda,但这不是我想要的。

最佳答案

How would I write the same thing with for_each and a lambda?

你不能(撇开异常(exception))。您的函数不与 for-each 循环(= 一种映射)同构,就这么简单。

相反,您的函数是通过归约来描述的,因此如果您想使用高阶函数来替换它,请使用归约,而不是映射。

如果 C++ 一个合适的通用reduce,那么你的算法将如下所示:

template<typename Iter, typename T>
bool contains2(Iter begin, Iter end, const T& x)
{
    return stdx::reduce(begin, end, [&x](const T& y, bool accumulator) {
        return accumulator or x == y;
    });
}

当然,只有当归约被适本地专门用于 bool 结果值时,这才会提前退出,以便短路。

唉,就我所见,C++ 不提供这样的功能。有accumulate但这不会短路(它不能 - C++ 不知道 lambda 内部的操作 是短路的,并且它不是递归实现的)。

关于c++ - 如何从 lambda 中的函数返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7291670/

相关文章:

c++ - std::async 究竟是如何执行的?

c++ - 令人困惑的指针声明

lambda - let-over-lambda 书中的 cl-ppcre 阅读器

javascript - 为什么这个函数返回真?

c++ - 在 C++ 中使用变量的值来引用变量的名称

C++/CPP 读取添加的十六进制地址

python - 对python中的lambda表达式感到困惑

c++ - 函数不返回值 (C++)

Java - 返回一个整数数组

c - 如何获取函数_beginthread的第一个参数_StartAddress的返回值