web-dev-qa-db-ja.com

ラムダ関数は再帰できますか?

可能性のある複製:
c ++ 0xの再帰的ラムダ関数

これは、単純な古い再帰関数です。

int fak(int n)
{
    return (n <= 1) ? 1 : n * fak(n - 1);
}

このような再帰関数をラムダ関数としてどのように書くのでしょうか?

[](int n) { return (n <= 1) ? 1 : n * operator()(n - 1); }
// error: operator() not defined

[](int n) { return (n <= 1) ? 1 : n * (*this)(n - 1); }
// error: this wasn't captured for this lambda function

現在のラムダを表す式があり、それ自体を再帰的に呼び出すことができますか?

82
fredoverflow

はい、できます。変数に保存して、その変数を参照できます(その変数の型をautoとして宣言することはできませんが、代わりにstd::functionオブジェクトを使用する必要があります)。例えば:

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

それ以外の場合、いいえ、ラムダの本体内からthisポインターを参照できません。

111
Andy Prowl