【问题标题】:Boost lambda recursion?提升 lambda 递归?
【发布时间】:2013-03-01 18:44:40
【问题描述】:

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;
}

【问题讨论】:

  • 如果您已经在使用 C++11,为什么不使用 std::function 和内置递归 lambda? stackoverflow.com/questions/2067988/…
  • boost::lambda 似乎比 msvc C++11 lambda 实现更加稳定和灵活...
  • 您在使用 VC++ 实现 lambda 时遇到了哪些问题?我已经使用了很多次,但没有发现任何问题(好吧,自 SP1 以来没有任何问题)。
  • @RichardJ.RossIII - 见编辑。还是不行。
  • @DavidH 如果您将初始化程序与声明放在一起,它将为我编译(带有clang和警告,但执行良好)。

标签: c++ boost-lambda


【解决方案1】:

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

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

【讨论】:

  • 不完全正确 - 如果您要获取 lambda 函数指针的基地址,您可以理论上将其转换为正确的类型,然后将其称为递归的。不过可能不值得。
【解决方案2】:

我发现的常规 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(我会这么认为?)。

【讨论】:

  • 这不是递归的;如果你这样做,它不会编译(在 VS2012 上)
  • 示例不是,我会修复它。它(或非常相似的东西,我无法访问适当的编译器 atm)肯定会编译,我经常使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
相关资源
最近更新 更多