web-dev-qa-db-fra.com

Les fonctions lambda peuvent-elles être récursives?

Duplicata possible:
Fonctions lambda récursives en c ++ 0x

Voici une ancienne fonction récursive simple:

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

Comment pourrais-je écrire une fonction récursive comme une fonction lambda?

[](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

Y a-t-il une expression qui dénote le lambda actuel afin qu'il puisse s'appeler récursivement?

82
fredoverflow

Oui, ils peuvent. Vous pouvez le stocker dans une variable et référencer cette variable (bien que vous ne puissiez pas déclarer le type de cette variable comme auto, vous devrez utiliser un std::function objet à la place). Par exemple:

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

Sinon, non, vous ne pouvez pas référencer le pointeur this depuis l'intérieur du corps du lambda.

111
Andy Prowl