2011-05-24 51 views
2

我想使用Boost.Phoenix创建一个由几行代码组成的lambda函数,然后“返回”一个值,以便我可以将它与std::transform一起使用。如何在Boost.Phoenix中使用一系列语句以及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函数返回一个值?


编辑:我改变了代码片段,因为我写的第一个地方导致了我想要做的事情的误解。

回答

1

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

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

(请注意,这同样的说法在Boost.Phoenix V3文档为好。)

1

在函数式编程,它不改变状态的意图。但是,您可以使用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); 
} 

我unfamilar凤凰,但可能有一种方法可以根据它定义MN::accumulate函数。

+0

也许我应该更清楚地表明,我在第一位发布的代码片段只是一个示例,与我的实际问题没有多大关系。我的问题涉及复杂的数据结构,'std :: transform'确实是我可以使用的唯一标准算法。我更新了这个问题来澄清这一点。 – AbuBakr 2011-05-25 08:32:29

相关问题