2009-08-28 9 views
9

Tengo un std :: vector y quiero verificar un atributo específico de cada elemento. SomeStruct tiene un atributo 'tipo'. Quiero comprobar que este atributo sea Type1 o Type2.Cómo usar boost :: lambda junto con std :: find_if?

Mi plan es usar boost :: lambda.

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

Porque necesito para acceder a un atributo específico de cada elemento, no estoy seguro si puedo uso boost :: lambda en absoluto.

¿Alguna pista?

Respuesta

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

Esto es perfecto, pero no puedo entender por qué funciona. También funciona de la misma manera si enlaza (& SomeStruct :: func, _1) (donde func es una función) que me confunde aún más. – yhager

+0

@yhager 'bind (& SomeStruct :: type, _1)' le da un impulso lambda que representa el resultado de hacer '.type' en el objeto que' _1' es un marcador de posición para. Para obtener más información [consulte la documentación para vincular] (http://www.boost.org/doc/libs/1_50_0/doc/html/lambda/le_in_details.html#lambda.bind_expressions). – sepp2k

1

Su expresión no compila debido

_1.type 

El operador punto no se puede sobrecargar por lo que su expresión no puede trabajar como una expresión lambda, es simplemente refiriéndose al miembro type del objeto _1 se define en el impulso :: lambda.hpp. Bueno, no sé qué es _1 tipo y pensar en este tipo me hace estremecer, no es para nosotros, mortales, saberlo :-).
La expresión adecuada viene dada por sepp2k.

+0

El tipo de '_1' es' boost :: lambda :: placeholder1_type'. – sepp2k

Cuestiones relacionadas