C++ 增强Lambda/凤凰-如何处理返回另一个Lambda的Lambda?
Boost Lambda/Phoenix是否支持开箱即用的类似于返回另一个Lambda的Lambda的东西 例如,可以用来做某种咖喱菜:C++ 增强Lambda/凤凰-如何处理返回另一个Lambda的Lambda?,c++,boost,lambda,functional-programming,currying,C++,Boost,Lambda,Functional Programming,Currying,Boost Lambda/Phoenix是否支持开箱即用的类似于返回另一个Lambda的Lambda的东西 例如,可以用来做某种咖喱菜: std::cout << [](int x){return [=](int y){return x+y;};}(1)(2); std::cout 我试图回答这个问题时遇到的问题是,arg1被最外层的bind消耗——我想要一个arg1我可以传递到内部的bind,但是外部的bind会吃掉它。如果我有办法“转义”参数占位符…@Yakk,您可以尝试使用
std::cout << [](int x){return [=](int y){return x+y;};}(1)(2);
std::cout
我试图回答这个问题时遇到的问题是,arg1
被最外层的bind
消耗——我想要一个arg1
我可以传递到内部的bind
,但是外部的bind
会吃掉它。如果我有办法“转义”参数占位符…@Yakk,您可以尝试使用boost::bind-AFAIK,它不同于lambda/phoenix bind()。还有,你的“尝试回答-赏金”明天就要结束了…@evgenypanasuk有没有一种简单的方法来生成一个懒惰的评估,比如[&]()->void{fully\u bound\u expression}直到晚些时候才会运行
?@Yakk,你能详细描述一下你的意思吗(可能通过C++11 lambdas的完整示例)?你是说?或者可能?void一些_函数(intx);自动延迟函数x=[](int x){return[=]{some_function(x);};};自动懒做=懒做(5);懒惰的,懒惰的代码>--当我天真地尝试使用bind
时,当每个参数都被绑定时,它会计算表达式。相反,我想延迟地绑定
,因此只有在我计算(使用()
)绑定
@Yakk,std::bind的空值结果后,最终执行才会发生:auto lazy=bind(some_函数,11);懒惰();
#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