2009-08-28 15 views
9

Ho un std :: vector e voglio controllare un attributo specifico di ogni elemento. SomeStruct ha un attributo 'type'. Voglio verificare questo attributo in modo che sia Type1 o Type2.Come usare boost :: lambda insieme a std :: find_if?

Il mio piano è utilizzare boost :: lambda.

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

Perché ho bisogno di accedere ad un attributo specifico di ogni elemento, non sono sicuro se posso uso boost :: lambda a tutti.

Eventuali suggerimenti?

risposta

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

Questo è perfetto, ma non riesco a capire perché funzioni. Funziona allo stesso modo anche se leghi (& SomeStruct :: func, _1) (dove func è una funzione) che mi confonde ancora di più. – yhager

+0

@yhager 'bind (& SomeStruct :: type, _1)' ti dà un boost lambda che sta per il risultato di fare '.type' sull'oggetto per cui' _1' è un segnaposto. Per ulteriori informazioni [consultare la documentazione per bind] (http://www.boost.org/doc/libs/1_50_0/doc/html/lambda/le_in_details.html#lambda.bind_expressions). – sepp2k

1

tua espressione non può essere compilato a causa di

_1.type 

L'operatore punto non può essere sovraccarichi, quindi la vostra espressione non può funzionare come un'espressione lambda, E 'semplice riferimento al membro type dell'oggetto _1 definito nella spinta :: lambda.hpp. Beh, non so che cos'è il tipo _1 e pensare a questo tipo mi fa rabbrividire - non è per noi, mortali, saperlo :-).
L'espressione corretta è data da sepp2k.

+0

Il tipo di '_1' è' boost :: lambda :: placeholder1_type'. – sepp2k

Problemi correlati