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]
と考えることができて、一時的な単純型を導入する必要があり、なぜ私は理解してと思うが、構造体のメンバを検索するユースケースがあるように見えるでしょう頻繁な要件なので、その使用法をサポートしない理由は何ですか?あるいは、一時変数を避ける別の方法がありますか?
そして、なぜだけではなく、 'のstd ::リスト
は::イテレータそれがのstd :: find_if(l.begin()、l.endを(=:C++ 14では、あなたは、初期化子でキャプチャを使用することができます)、[s1](S s){return s.S1 == s1.S1;}); '? ところで、あなたのラムダがスコープの終わりを過ぎても生きていない場合は、参照によるキャプチャを使用してみませんか? – bipll