Можно ли повысить :: лямбда рекурсивно?
Это не компилируется:
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;
}
Лямбда-функции не могут напрямую вызывать себя, потому что у них нет имени.
Обходной путь прост: используйте именованную функцию.
Самый простой способ, который я нашел с обычными лямбдами 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 (я бы так предположил?).