0

boost :: lambdaを再帰的に使用できますか?

これはコンパイルされません:

using namespace boost::lambda;

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

推奨される回避策はありますか?

編集:C ++ 11ラムダの使用について:以下は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 ラムダで見つけた最も簡単な方法は、最初にラムダを含む変数を宣言し、それを定義してラムダを作成することです。すでに宣言されていると、宣言を定義/ラムダ自体で使用できます。例えば:

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 に答える