如何在对象容器中搜索数据成员值?

Lig*_*ica 3 c++ boost boost-bind c++03

我有一个像这样的对象类型:

struct T
{
   int x;
   bool y;
};
Run Code Online (Sandbox Code Playgroud)

和他们的容器像这样:

std::vector<T> v;
Run Code Online (Sandbox Code Playgroud)

和强烈的愿望来决定- 在单个语句 -任何元素是否vy == true.这可能涉及到std::find_if.

我的理解是,std::bind并且boost::bind适用于成员函数,不能应用于成员数据.


因为我不喜欢他们,我希望避免:

  • 比较函数/仿函数
  • 循环

因为我的环境是C++ 03,所以以下内容不可用:

  • lambda表达式

Lig*_*ica 9

我的理解是,std::bind并且boost::bind适用于成员函数,不能应用于成员数据.

值得注意的是,事实并非如此!boost::bind将很高兴地绑定到成员数据,并允许您在"内联迭代"期间对其执行操作.

文档:

指向成员函数和指向数据成员的指针不是函数对象,因为它们不支持operator().为方便起见,bind接受成员指针作为其第一个参数,行为就像使用boost :: mem_fn将成员指针转换为函数对象一样.换句话说,表达

bind(&X::f, args)
Run Code Online (Sandbox Code Playgroud)

相当于

bind<R>(mem_fn(&X::f), args)
Run Code Online (Sandbox Code Playgroud)

其中RX :: f的返回类型(对于成员函数)或成员的类型(对于数据成员).

另外,从以下文档boost::mem_fn:

mem_fn还支持指向数据成员的指针,将它们视为不带参数的函数,并返回对该成员的(const)引用.

所以,你可以这样做:

#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <boost/bind.hpp>

struct T
{
   int x;
   bool y;
};

void f(const std::string& name, const std::vector<T>& v)
{
   const bool found = std::find_if(
      v.begin(),
      v.end(),
      boost::bind(&T::y, _1) == true
   ) != v.end();

   std::cout << name << ": " << (found ? " FOUND" : " not found") << '\n';
}

int main()
{
   T a = { 0, false };
   T b = { 1, false };
   T c = { 2, true  };

   std::vector<T> v;
   f("a", v);

   v.push_back(a);
   v.push_back(b);
   f("b", v);

   v.push_back(c);
   f("c", v);
}
Run Code Online (Sandbox Code Playgroud)

输出:

a:未找到
b:未找到
c:FOUND

  • +1这里有一个非常有趣的聊天xD (3认同)