如何将 Boost.Phoenix 中的一系列语句与 std::transform 一起使用?
我想使用 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 函数返回一个值?
编辑:我更改了代码片段,因为我首先编写的内容导致了对我想要做什么的误解。
I'd like to use Boost.Phoenix to create a lambda function that consists of a few lines of code and then "returns" a value so I can use it together with std::transform
.
Like this:
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?
)
);
With std::for_each
this would work perfectly, but with std::transform
it does not compile because the comma operator returns void
. How can I return a value from a lambda function like this?
Edit: I changed the code fragment because what I wrote in the first place led to misunderstandings about what I want to do.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不,这是不可能的。来自 Boost.Phoenix v2 语句文档:
(请注意,Boost.Phoenix v3 文档中也有同样的断言。)
No, this isn't possible. From the Boost.Phoenix v2 statement docs:
(Note that this same assertion is in the Boost.Phoenix v3 docs as well.)
在函数式编程中,改变状态并不是目的。但是,您可以使用
accumulate
,而不是使用for_each
。累加意味着你有一个“起始值”(例如 m=1,n=0),以及一个将值“添加”到输出值的函数:我对 Phoenix 不熟悉,但可能有一种方法来定义
MN::accumulate
函数就其而言。In functional programming, it's not the intention to change state. However, instead of using
for_each
, you may useaccumulate
. Accumulating implies you have a 'starting value' (e.g. m=1,n=0), and a function that 'adds' a value to an output value:I'm unfamilar with Phoenix, but probably there is a way to define the
MN::accumulate
function in terms of it.