2015-09-03 3 views
2

J'ai une classe comme çautilisant boost :: lambda ou boost :: Phoenix avec std :: find_if

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

Je veux utiliser find_if sur un vecteur plein d'objets Foo, comme ceci:

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

Je ne comprends pas ce que j'ai à écrire au lieu de ??? Je sais qu'il y a soit _1 avec boost :: lambda ou arg1 avec boost :: phoenix, mais après ça je suis à perte.

Edit:

J'ai essayé le suivant qui ne fonctionne pas, même si je l'ai vu comme ça dans de nombreux exemples.

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

Puis-je obtenir l'erreur suivante:

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

pourquoi le faire vous-même lorsque vous pouvez utiliser la C++ 11 standard? –

+0

@David Haim: Je voudrais pouvoir;) – gartenriese

+0

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

Répondre

4

Utilisez boost::bind pour ce cas, il est vraiment la meilleure façon avant C++ 11.

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

Si vous devez utiliser phoenix vous pouvez utiliser phoenix::bind.

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

phx est

namespace phx = boost::phoenix; 

Si vous pouvez utiliser C++ 11 - vous pouvez utiliser std::bind, ou une fonction lambda

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

J'ai essayé, mais cela ne fonctionne pas, voir mon edit. – gartenriese

+0

@gartenriese vous essayez tort. Dans mon exemple, c'est juste boost boost, pas boost lambda bind. Et regardez mon exemple, dans votre exemple il n'y a pas de comparaison avec la valeur réelle. – ForEveR

+0

Oh mon dieu! Si j'utilise boost :: bind au lieu de boost :: lambda :: bind, cela fonctionne. Merci beaucoup, je ne l'aurais jamais deviné! – gartenriese