/ / predicado da função / lambda a ser usado para find_if, que compara o elemento do mapa do tipo composto - c ++, if-statement, find, predicate

predicado de função lambda a ser usado para find_if, que compara o elemento de mapa de tipo composto - c ++, if-statement, find, predicate

Consulte o seguinte snippet de código abaixo:

typedef boost::tuple<std::string, int, std::string> TUPLE;
std::map<int, TUPLE> m;

std::find_if
(
m.begin(),
m.end(),
boost::lambda::bind
(
&std::map<int, TUPLE>::value_type::second_type::head,
boost::lambda::bind
(
&std::map<int, TUPLE>::value_type::second,
boost::lambda::_1
)
)
==
"someString"
);

Estou tentando criar um predicado para find_if (usando boost lambda) e comparar o primeiro elemento de uma tupla com uma string. No entanto, existe alguma maneira de fazer isso funcionar como algo como:

typedef boost::tuple<std::string, int, std::string> TUPLE;
std::map<int, TUPLE> m;

std::find_if
(
m.begin(),
m.end(),
boost::lambda::bind
(
&std::map<int, TUPLE>::value_type::second_type::get<0>,
boost::lambda::bind
(
&std::map<int, TUPLE>::value_type::second,
boost::lambda::_1
)
)
==
"someString"
);

Alterei second_type :: head para second_type :: get <0>, mas ele não é compilado. Eu estou tentando criar predicado que compara o primeiro ou segundo elemento da tupla para alguma seqüência de caracteres.

Este é um dos erros que estou recebendo:

Erro 29 erro C2780: "const boost :: lambda :: lambda_functor>, detail :: bind_tuple_mapper :: type >> boost :: lambda :: bind (const Arg1 &)": espera 1 argumentos - 2 fornecidos

Existe alguma maneira de comparar especificamente o enésimoelemento da tupla? (não apenas a cabeça) Tentei representar os elementos da tupla como struct e funciona, mas ficarei grato se houver uma maneira de usar a tupla.

Nota lateral: não consigo usar [](){} notação por causa da versão do compilador.

Respostas:

2 para resposta № 1

Ok, eu não sei sobre boost, mas com C ++ 11 lambdas seria o seguinte:

typedef std::tuple<std::string, int, std::string> TUPLE;
std::map<int, TUPLE> m;

std::find_if(m.begin(), m.end(), [] (const std::pair<int, TUPLE>& v) {
return v.second.get<1>() == "someString";
});

Supondo que a partir da documentação do impulso, isso seria:

std::find_if(m.begin(), m.end(),
return boost::lambda::_1.second.second == "someString");