如何将 Boost.Phoenix 中的一系列语句与 std::transform 一起使用?

发布于 2024-11-09 03:45:34 字数 597 浏览 0 评论 0原文

我想使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

数理化全能战士 2024-11-16 03:45:34

不,这是不可能的。来自 Boost.Phoenix v2 语句文档

与惰性函数和惰性运算符不同,惰性语句始终返回 void。

(请注意,Boost.Phoenix v3 文档中也有同样的断言。)

No, this isn't possible. From the Boost.Phoenix v2 statement docs:

Unlike lazy functions and lazy operators, lazy statements always return void.

(Note that this same assertion is in the Boost.Phoenix v3 docs as well.)

铁轨上的流浪者 2024-11-16 03:45:34

在函数式编程中,改变状态并不是目的。但是,您可以使用 accumulate,而不是使用 for_each。累加意味着你有一个“起始值”(例如 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 );
}

我对 Phoenix 不熟悉,但可能有一种方法来定义MN::accumulate 函数就其而言。

In functional programming, it's not the intention to change state. However, instead of using for_each, you may use accumulate. Accumulating implies you have a 'starting value' (e.g. m=1,n=0), and a function that 'adds' a value to an output value:

#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 );
}

I'm unfamilar with Phoenix, but probably there is a way to define the MN::accumulate function in terms of it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文