2011-05-24 52 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

相關問題