2016-06-02 5 views
0

this questionで我々が持っている:のstd :: find_ifとラムダ参照構造体のフィールド

#include <list> 
#include <algorithm> 

struct S 
{ 
    int S1; 
    int S2; 
}; 

int main() 
{ 
    std::list<S> l; 
    S s1; 
    s1.S1 = 0; 
    s1.S2 = 0; 
    S s2; 
    s2.S1 = 1; 
    s2.S2 = 1; 
    l.push_back(s2); 
    l.push_back(s1); 

    auto it = std::find_if(l.begin(), l.end(), [] (S s) 
     { return s.S1 == 0; }); 
} 

しかし、私はs1.S1に一致するものを検索したい場合は、私が試してみてください:

auto it = std::find_if(l.begin(), l.end(), [s1.S1] (S s) 
    { return s.S1 == s1.S1; }); 

を私が手しかしコンパイラエラー。これは動作します:

auto foo = s1.S1; 
auto it = std::find_if(l.begin(), l.end(), [foo] (S s) 
    { return s.S1 == foo; }); 

私は、私たちは関数のパラメータなどの[foo]と考えることができて、一時的な単純型を導入する必要があり、なぜ私は理解してと思うが、構造体のメンバを検索するユースケースがあるように見えるでしょう頻繁な要件なので、その使用法をサポートしない理由は何ですか?あるいは、一時変数を避ける別の方法がありますか?

+2

そして、なぜだけではなく、 'のstd ::リストは::イテレータそれがのstd :: find_if(l.begin()、l.endを(=:C++ 14では、あなたは、初期化子でキャプチャを使用することができます)、[s1](S s){return s.S1 == s1.S1;}); '? ところで、あなたのラムダがスコープの終わりを過ぎても生きていない場合は、参照によるキャプチャを使用してみませんか? – bipll

答えて

1

C++ 11では、中間変数を追加することに悩まされていると思います。

std::list<S>::iterator it = std::find_if(l.begin(), l.end(), 
    [foo = s1.S1] (S s) { return s.S1 == foo; }); 
// ^^^^^^^^^^^^^ 
関連する問題