使用成员变量作为谓词

Using member variable as predicate

本文关键字:谓词 变量 成员      更新时间:2023-10-16

>我正在尝试在对象向量中找到一个对象,该对象变量的值为真。是否可以在不定义 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。

并不是说使用 lambda 是问题,只是好奇。

您可以使用std::mem_fn

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

演示

请注意,范围库应直接允许:

auto iter = range::find_if(v, &A::value);

如果您不能使用 C++11 lambda,您可以使用 std::bind

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

解决方案如下

  1. (可选)不要将构造函数A(bool)标记为显式以允许从boolA的隐式转换(coliru 上的现场演示)
  2. 重载operator==(),以便它仅使用value来建立相等性。

您还可以提供operator==(bool v) { return value == v;}(请参阅此演示)

当然,我建议您不要使用该解决方案,因为它很脏。只需使用 std::find_if 提供一个谓词即可完成工作。请注意,所述谓词必须具有operator()因此您当然不能提供诸如bool之类的值作为谓词std::find_if