Сравнение функций-членов в качестве предикатов - PullRequest
3 голосов
/ 10 июля 2011

У меня есть такая структура.

struct A
{
  int someFun() const;
  int _value;
};

Я храню объекты этой структуры в векторе.

  1. Как найти объект, элемент которого someFun() возвращает 42?

  2. Как найти объект, чей _value равен 42?

Полагаю, мне нужно использовать комбинацию bindи equal_to, но я не могу найти правильный синтаксис.

vector<A> va;
vector<A>::const_iterator val = find_if(va.begin(),va.end(),boost::bind(???,42));

Редактировать:

Спасибо.Но еще одно сомнение.

Что если бы у меня было vector<A*> или vector<boost::shared_ptr<A> >?

1 Ответ

4 голосов
/ 10 июля 2011
vector<A> va;

vector<A>::const_iterator v0 = find_if(
    va.begin()
    , va.end()
    , boost::bind(&A::someFun, _1) == 42 );

vector<A>::const_iterator v1 = find_if(
    va.begin()
    , va.end()
    , boost::bind(&A::_value, _1) == 42 );

В случае, если вам do необходимо составить выражения связывания (например, используя functor, который нельзя выразить с помощью операторов, поддерживаемых boost::bind):

vector<A>::const_iterator v1 = find_if(
    va.begin()
    , va.end()
    , boost::bind(functor(), boost::bind(&A::someFun, _1), 42) );

, что приводит к вызову functor::operator() со следующими аргументами: результат вызова члена по аргументу в выражении связывания и 42.

...