考虑链表列表节点的以下定义:

struct Node
{
    int data;
    struct Node *next;
};

我是c++的新手,来自函数式编程。我希望编写一个lambda来计算链表的长度。
我写:
auto listLength = [](Node * list){
    if(list == NULL) return 0;
    else return 1 + listLength(list -> next);
};

error: variable 'lengthList' declared with 'auto' type cannot appear in its own initializer

如果从auto更改为int,则会得到:
 error: called object type 'int' is not a function or function pointer

有什么问题

最佳答案

问题是双重的:

1)Lambda需要捕获在Lambda之外定义的任何对象。

2)listLength的定义直到整个变量声明的结尾才完整。

这有点像鸡与蛋的问题。最干净的解决方案是使用std::function:

#include <functional>

std::function< int (Node *)> listLength;

listLength = [&](Node * list){
    if(list == NULL) return 0;
    else return 1 + listLength(list -> next);
};

10-04 14:53