我试图在对象向量中找到一个对象,其成员变量的值为true。可以在没有定义lamba函数或函数对象的情况下完成,只需指定成员变量本身:
class A
{
public:
explicit A(bool v, int v2, float v3) : value(v), value2(v2), value3(v3)
{}
...
bool value;
int value2;
float value2;
...
}
int main()
{
std::vector<A> v;
v.push_back(A(false, 1, 1.0));
v.push_back(A(true, 2, 2.0));
v.push_back(A(false, 3, 3.0));
auto iter = std::find_if(v.begin(), v.end(), &A::value);
}
如上所述进行编译不起作用,因为它假设A *而不是A。
使用lambdas并不是一个问题,只是好奇。
答案 0 :(得分:7)
您可以使用std::mem_fn
auto iter = std::find_if(v.begin(), v.end(), std::mem_fn(&A::value));
请注意,range library应该直接允许:
auto iter = range::find_if(v, &A::value);
答案 1 :(得分:3)
如果您不能使用C ++ 11 lambdas,则可以使用std::bind
执行此操作:
auto iter = std::find_if(v.begin(), v.end(), std::bind(&A::value, std::placeholders::_1));
答案 2 :(得分:0)
解决方案可以是以下
A(bool)
标记为显式,以允许从bool
隐式转换为A
(live demo on coliru)operator==()
,以便它仅使用value
来建立相等。您还可以提供operator==(bool v) { return value == v;}
(请参阅此demo)
当然我建议你不要使用那个解决方案,因为它非常脏。只需使用std::find_if
提供谓词来完成工作。请注意,所述谓词必须为operator()
,因此您无法提供bool
等值作为std::find_if
的谓词
答案 3 :(得分:-1)
您无法直接传递该成员,但作为一种解决方法,您可以定义一个免费功能
bool pred(const A& a){ return a.value; }
并使用
auto iter = std::find_if(v.begin(), v.end(), pred);
这不是使用lambdas或函数对象,而是一个普通的旧函数指针,如果这是你正在寻找的。 p>