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

时间:2011-05-24 17:01:24

标签: c++ boost boost-phoenix

我想使用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函数返回一个值?


编辑:我改变了代码片段,因为我首先写的是导致对我想要做的事情的误解。

2 个答案:

答案 0 :(得分:1)

不,这是不可能的。来自Boost.Phoenix v2 statement docs

  

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

(请注意,同样的断言也在B​​oost.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函数。