используя boost :: lambda или boost :: phoenix с помощью std :: find_if

У меня есть такой класс

class Foo {
public:
int GetID() const { return m_id; }
private:
int m_id;
};

Я хочу использовать find_if для вектора, полного объектов Foo, например:

std::find_if(foos.begin(), foos.end(), ???.GetID() == 42);

Я не совсем понимаю, что я должен написать вместо ??? Я знаю, что есть _1 с boost :: lambda или arg1 с boost :: phoenix, но после этого я в растерянности.

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

Я попробовал следующее, которое не работает, хотя я видел это во многих примерах.

std::find_if(foos.begin(), foos.end(), boost::lambda::bind(&Foo::GetID, boost::lambda::_1) == 42);

Тогда я получаю следующую ошибку:

ошибка C2678: двоичный файл «==»: не найден оператор, который принимает левый операнд типа «const boost :: lambda :: lambda_functor» (или нет приемлемого преобразования)

2

Решение

использование boost::bind в этом случае это действительно самый простой способ до C ++ 11.

std::find_if(foos.begin(), foos.end(), boost::bind(&Foo::GetId, _1) == 42);

Если вы должны использовать phoenix ты можешь использовать phoenix::bind,

std::find_if(foos.begin(), foos.end(),
phx::bind(&Foo::GetId, phx::placeholders::_1) == 42);

где phx является

namespace phx = boost::phoenix;

Если вы можете использовать C ++ 11 — вы можете использовать std::bindили лямбда-функция

std::find_if(foos.begin(), foos.end(),
[](const Foo& f) { return f.GetId() == 42; });
4

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector