У меня есть такой класс
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» (или нет приемлемого преобразования)
использование 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; });