在这个问题中,我们有:
#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]
视为函数参数一样,但是查找结构成员的用例似乎是经常需要的,所以不这样做的原因是什么?支持用法?还是有另一种避免临时变量的方法?
在C ++ 11中,我认为您一直坚持添加中间变量。在C ++ 14中,可以将捕获与初始化程序一起使用:
std::list<S>::iterator it = std::find_if(l.begin(), l.end(),
[foo = s1.S1] (S s) { return s.S1 == foo; } );
// ^^^^^^^^^^^^^
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句