2009-08-28 11 views
9

Ich habe einen Std :: Vector und ich möchte ein bestimmtes Attribut jedes Elements überprüfen. SomeStruct hat ein Attribut 'type'. Ich möchte überprüfen, ob dieses Attribut entweder Type1 oder Type2 ist.Wie boost :: lambda zusammen mit std :: find_if?

Mein Plan ist es, boost :: lambda zu verwenden.

std::vector<SomeStruct>::const_iterator it = 
    std::find_if(
     vec.begin(), vec.end(), 
     _1.type == SomeStruct::Type1 || _1.type == SomeStruct::Type2); 

Da brauche ich ein bestimmtes Attribut jedes Elements zugreifen zu können, bin ich nicht sicher, ob ich das kann Verwendung boost :: lambda überhaupt.

Irgendwelche Hinweise?

Antwort

10
std::find_if(
    vec.begin(), vec.end(), 
    bind(&SomeStruct::type, _1) == SomeStruct::Type1 || 
    bind(&SomeStruct::type, _1) == SomeStruct::Type2); 
+0

Das ist perfekt, aber ich kann nicht ergründen, warum es funktioniert. Es funktioniert auch genauso, wenn du bindst (& SomeStruct :: func, _1) (wobei func eine Funktion ist), was mich noch mehr verwirrt. – yhager

+0

@yhager 'bind (& SomeStruct :: type, _1)' gibt Ihnen ein Boost-Lambda, das für das Ergebnis von '.type' auf dem Objekt steht, für das' _1' ein Platzhalter ist. Weitere Informationen finden Sie in der Dokumentation zu bind (http://www.boost.org/doc/libs/1_50_0/doc/html/lambda/le_in_details.html#lambda.bind_expressions). – sepp2k

1

Ihr Ausdruck wegen

_1.type 

Der Punkt-Operator nicht so überlastet wird nicht kompilieren kann Ihr Ausdruck nicht als Lambda-Ausdruck arbeitet, einfach Mitglied Es bezieht type des Objekts _1 in boost :: lambda.hpp Nun, ich weiß nicht, was ist _1 Typ und Gedanken über diesen Typ macht mich schaudern - es ist nicht für uns, Sterbliche, es zu wissen :-).
Der richtige Ausdruck wird von sepp2k gegeben.

+0

Der Typ von '_1' ist' boost :: lambda :: placeholder1_type'. – sepp2k

Verwandte Themen