递归布尔 lambda C++

Recursive boolean lambda C++

本文关键字:C++ lambda 布尔 递归      更新时间:2023-10-16

出于某种原因,这个lambda语句不想编译:

bool DepthFirstSearch = [](Graph *g, bool *ch, stack<int> &S, int v, int w) -> bool
{
 //Here is recursive DFS code
};

错误:no suitable conversion function from: "lambda[]bool()->bool" to bool exists .

我的问题是为什么?

lambda 的类型不是 bool 。您可以使用auto来完成这项工作

auto DepthFirstSearch = [](Graph *g, bool *ch, stack<int> &S, int v, int w) -> bool { ... }

或者使用 std::function 显式指定返回类型,但这将非常麻烦。请参阅 http://en.cppreference.com/w/cpp/utility/functional/function。

通常,只使用 auto 更容易,否则每次更改 lambda 的参数时都必须更改变量的类型。

如果你想让它递归,那么你必须捕获lambda(通过引用)。为此,您需要为其指定命名类型:

std::function<bool(Graph*, bool*, stack<int>&, int, int)> DepthFirstSearch = 
    [&](Graph *g, bool *ch, stack<int> &S, int v, int w) {
        // bunch of code here that possibly calls DepthFirstSearch
    };

你不能只在这里做auto DepthFirstSearch = [=](...){...}因为 lambda 需要知道DepthFirstSearch的类型才能捕获它 - 如果你只使用 auto那么在处理 lambda 表达式之前该类型将不存在,这为时已晚。因此std::function<...>.