Пожалуйста, смотрите следующий фрагмент кода ниже:
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");
Я пытаюсь создать предикат для find_if (используя boost lambda) и сравнить первый элемент кортежа со строкой. Тем не менее, есть ли способ заставить эту работу примерно так:
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");
Я изменил second_type :: head на second_type :: get<0> но он не компилируется.
Я пытаюсь создать предикат, который сравнивает 1-й или 2-й элемент кортежа с некоторой строкой.
Это одна из ошибок, которые я получаю:
Ошибка 29 ошибка C2780: ‘const boost :: lambda :: lambda_functor>, detail :: bind_tuple_mapper :: type >> boost :: lambda :: bind (const Arg1 &) ‘: ожидается 1 аргумент — 2 предоставлено
Есть ли способ конкретно сравнить n-й элемент кортежа? (не только голова)
Я попытался представить элементы кортежа как struct, и это работает, но я буду благодарен, если есть способ использовать кортеж.
Примечание: я не могу использовать [](){}
обозначение из-за версии компилятора.
Хорошо, я не знаю о повышении, но с лямбдами C ++ 11 это было бы следующим:
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";
});
Исходя из документации буста, это будет:
std::find_if(m.begin(), m.end(),
return boost::lambda::_1.second.second == "someString");
Других решений пока нет …