2011-07-25 151 views
2

我想轉換爲使用新標準(C++ 0x中)編寫的函數返回到以前的標準lambda表達式轉換

我如何轉換以下行

typedef std::vector<value3 const*> passmem; 
pasmem pm; // neighborhood sequence 
std::for_each(pm.begin(), pm.end(), [&] (value3 const* x) 
+10

你的問題似乎缺少一些代碼。 –

+1

以及你想要代碼轉換爲什麼的描述。 –

+0

您應該添加函數的主體,取決於函數的主體是什麼,生成的代碼可能會有所不同。 –

回答

4

只是lambda表達式轉換成命名函數並將其作爲參數傳遞給for_each。或者只是做你的拉姆達內聯函數等的功能:

for (pasmem::iterator it=pm.begin(); it != pm.end(); ++it) { 
     // Do the lambda functionality with *it 
    } 
+1

我想你的意思是'it!= pm.end();'而不是'* it!= pm.end()'。 '++它'也被廣泛認爲是很好的一般實踐 -​​ 對於某些迭代器可以更有效率,但很少有實際意義上的差異。 –

+1

'pm'表示一個實例,你不能從一個實例中提取一個類型成員,而是需要類型(或者一個typedef別名):'for(passmem :: iterator it = pm.begin()...' –

+0

你對了,我修好了。 –

1
for(passmem::const_iterator i = pm.begin(); i != pm.end(); ++i) 
{ 
    const value3* x = *i; 
    // same as in lambda 
} 
1

處理拉姆達的基本規則需要創建一個函數對象,提供operator()具有相同簽名的拉姆達。對於每個捕獲的字段,您都需要向仿函數中添加一個成員,並在構造中初始化它。在你的特定情況下,將由參考const參考,這取決於你的lambda被定義的位置和涉及的類型。

如果對於一個不平凡的,拉姆達被累積在所述向量中的每個元素的值到一個局部變量,以及(假設value3具有適當的運營商):

struct accumulator__ { 
    value3 & v_; 
    accumulator__(value3 & v) : v_(v) {} 

    void         // for_each ignores the return value 
    operator()(value3 const * p) {  // same argument as lambda 
     v_ += *p; 
    } 
}; 

如果拉姆達被定義爲一個成員函數,並且它訪問了該類的任何成員,那麼事情會變得有點棘手,但你基本上必須手動創建所有訪問的字段的閉合(即添加[const]引用所有訪問的成員。真正的lambda(我相信)只捕獲this,但在重構中你 可能會失去對班級成員的訪問權限。

0

起初,@ george272有解決方案(儘管我會調用迭代器(c)it而不是i)。

再回到您的原代碼,你不應該(幾乎)用不完的for_each在C++ 11

這是爲什麼:

typedef std::vector<value3 const*> passmem; 
pasmem pm; // neighborhood sequence 
for(auto x : pm) 
{ 
    // do your stuff as normal but with less typing ;) 
}