提升Lambda/Phoenix - 如何做lambda返回另一个lambda?

qbl*_*ble 6 c++ lambda boost functional-programming currying

Boost Lambda/Phoenix是否支持像lambda那样返回另一个lambda?

例如,这可以用来做某种currying:

std::cout << [](int x){return [=](int y){return x+y;};}(1)(2);
Run Code Online (Sandbox Code Playgroud)

如何实现与Boost Lambda/Phoenix类似的目的(+作为奖励 - 我们会得到多态行为)?

Evg*_*yuk 5

提升凤凰范围:让/ lambda

现场演示:

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

3
6
3
6
Run Code Online (Sandbox Code Playgroud)