0

boost::lambda 可以递归使用吗?

这不编译:

using namespace boost::lambda;

auto factorial = (_1 == 0) ? 1 : factorial(_1-1);

有建议的解决方法吗?

编辑:关于使用 C++11 lambdas:以下内容无法在 VS2012 上编译:

std::function<int(int)> factorial;
factorial = [&factorial](int p)->int { return (p == 0) ? 1 : p*factorial(p-1); };

int main(int argc, char* argv[])
{
    int i = factorial(5);
return 0;
}

另一个编辑:奇怪的是,这个工作正常:

std::function<int(int)> factorial =
    [&](int p)->int { return (p == 0) ? 1 : p*factorial(p-1); };

int main(int argc, char* argv[])
{
    int i = factorial(5);
return 0;
}
4

2 回答 2

1

Lambda 函数不能直接调用自己,因为它们没有名称。

解决方法很简单:使用命名函数。

于 2013-03-01T18:51:16.707 回答
0

我发现使用常规 C++11 lambda 的最简单方法是先声明将包含 lambda 的变量,然后定义它并创建 lambda。已经声明允许在定义/lambda 本身中使用声明。例如:

std::function<int (int)> factorial = nullptr;
factorial = [](int x) -> int {
     if (x <= 1) {
         return 1;
     } else {
         return (x * factorial(x-1));
     }
 };

到目前为止,我对该方法没有任何问题,尽管您确实必须知道声明的签名并且我不知道它是否适用于 boost::lambda (我会假设如此?)。

于 2013-03-01T18:51:05.357 回答