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 № 1Ok, 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");