使用成员变量作为谓词

时间:2016-06-08 08:58:58

标签: c++

我试图在对象向量中找到一个对象,其成员变量的值为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并不是一个问题,只是好奇。

4 个答案:

答案 0 :(得分:7)

您可以使用std::mem_fn

auto iter = std::find_if(v.begin(), v.end(), std::mem_fn(&A::value));

Demo

请注意,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)

解决方案可以是以下

  1. (可选)不要将构造函数A(bool)标记为显式,以允许从bool隐式转换为Alive demo on coliru
  2. 重载operator==(),以便它仅使用value来建立相等。
  3. 您还可以提供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或函数对象,而是一个普通的旧函数指针,如果这是你正在寻找的。