Boost Lambda / Phoenix — как сделать лямбду, которая возвращает другую лямбду?

Поддерживает ли Boost Lambda / Phoenix из коробки что-то вроде лямбды, которая возвращает другую лямбду?

Например, это может быть использовано для карри:

std::cout << [](int x){return [=](int y){return x+y;};}(1)(2);

Как достичь аналогичной цели с помощью Boost Lambda / Phoenix (+ в качестве бонуса — мы бы получили полиморфное поведение)?

6

Решение

Boost Phoenix Scope: пусть / лямбда

Живая демоверсия:

#include <boost/phoenix.hpp>
#include <iostream>
#include <ostream>

using namespace std;
using namespace boost;
using namespace phoenix;
using namespace arg_names;
using namespace local_names;

int main()
{
// capture by reference:
cout <<
(lambda(_a=_1)[_1 + _a ])(1)(2)
<< endl;
cout <<
(lambda(_b=_1)[lambda(_a=_1)[_1 + _a + _b ]])(1)(2)(3)
<< endl;
// capture by value:
cout <<
(lambda(_a=val(_1))[_1 + _a ])(1)(2)
<< endl;
cout <<
(lambda(_b=val(_1))[lambda(_a=val(_1))[_1 + _a + _b ]])(1)(2)(3)
<< endl;
}

Выход:

3
6
3
6
5

Другие решения

Других решений пока нет …