2011-06-20 18 views
2

我在類的成員函數的局部變量上使用std::for_each循環。我想從for_each中的lambda調用同一個類的另一個成員函數。下面是什麼,我試圖做一個簡單的例子:捕獲這個訪問成員函數所需的東西嗎?

void some_class::another_function() 
{ 
    cout << "error"; 
} 
void some_class::some_function(function<bool(const int)> &f) 
{ 
    vector<int> local_variable = {0,0,0,1,1,3,5,43}; 

    std::for_each(local_variable.begin(), local_variable.end(), 
      [&f](const int item) 
      { 
       if(!f(item)) 
        another_function(); 
      } 
} 

GCC 4.6是告訴我,this沒有捕獲(所以我應該這樣做)。這是最好的解決方案嗎?或者我應該只捕獲我需要的那些功能(但對於較大的構造,這可能會很麻煩)?

回答

5

GCC是正確的:要從lambda內調用this上的成員函數,您必須捕獲this。如果成員函數不依賴於數據成員,則使其成爲static,然後不需要捕獲this

您不能捕獲「函數」,只能捕獲局部變量(包括參數和this,但不包含特定的數據成員)。

+0

代替明確地捕獲'this',他可以使用[&]通過引用捕獲所有內容。這是一個使用'std :: for_each'的本地函數;沒有理由不通過引用捕獲所有內容,並可能將編譯器生成的仿函數優化爲簡單的函數指針。 –

+0

只捕獲** nothing **的lambda可以簡化爲函數指針。但是,不管捕獲集是什麼,lambda都將是一個帶有內聯函數調用操作符的類,並且可能直接內聯到'std :: for_each'循環中。使用'[&]'捕獲所有內容肯定比輸入每個變量的輸入要少。 –

1

如果您想要調用成員函數,那麼您需要捕獲this,這幾乎就是它的結尾。

相關問題