我想使用Boost.Phoenix创建一个由几行代码组成的lambda函数,然后“返回”一个值,这样我就可以将它与std::transform
一起使用。
像这样:
std::transform(a.begin(), a.end(), b.begin(),
(
//Do something complicated here with the elements of a:
statement1,
statement2,
statement3
//Is there a way to return a value here?
)
);
使用std::for_each
这可以完美地工作,但是std::transform
它不会编译,因为逗号运算符返回void
。如何从这样的lambda函数返回一个值?
编辑:我改变了代码片段,因为我首先写的是导致对我想要做的事情的误解。
答案 0 :(得分:1)
不,这是不可能的。来自Boost.Phoenix v2 statement docs:
与惰性函数和惰性运算符不同,惰性语句总是返回void。
(请注意,同样的断言也在Boost.Phoenix v3文档中。)
答案 1 :(得分:1)
在函数式编程中,并不是要改变状态。但是,您可以使用for_each
,而不是accumulate
。累积意味着你有一个'起始值'(例如m = 1,n = 0),以及一个向输出值“添加”值的函数:
#include <vector>
struct MN { int m, n;
MN(int m,int n):m(m),n(n){}
static MN accumulate( MN accumulator, int value ) {
return MN( accumulator.m + value, accumulator.n * value );
}
}; // your 'state'
int main(){
std::vector<int> v(10,10); // { 10, 10, ... }
MN result = std::accumulate( v.begin(), v.end(), MN(0,1), MN::accumulate );
printf("%d %d", result.m, result.n );
}
我对凤凰城并不熟悉,但可能有一种方法来定义MN::accumulate
函数。