2015-09-03 5 views
2

У меня есть класс, как этотиспользуя подталкивание :: лямбда или повышение :: феникс с станд :: 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, но после этого я в недоумении.

Edit:

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

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

Затем я получаю следующее сообщение об ошибке:

error C2678: binary '==' : no operator found which takes a left-hand operand of type 'const boost::lambda::lambda_functor' (or there is no acceptable conversion)

+0

почему делает это для себя, когда вы можете использовать C++ 11 standard? –

+0

@David Haim: Я бы хотел;) – gartenriese

+0

'std :: find_if (foos.begin(), foos.end(), (& boost :: phoenix :: placeholders :: _ 1 -> * & Foo :: GetID) () == 42); ' –

ответ

4

Используйте 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; }); 
+0

Я пробовал это, но он не работает, см. мое редактирование. – gartenriese

+0

@gartenriese вы пытаетесь ошибаться. В моем примере это просто принудительное связывание, а не усиление лямбда-привязки. И посмотрите на мой пример, в вашем примере нет сравнения с фактическим значением. – ForEveR

+0

О, мой. Если я использую boost :: bind вместо boost :: lambda :: bind, он работает. Большое спасибо, я никогда не догадывался! – gartenriese