Предикат лямбда-функции для использования для find_if, который сравнивает элемент карты составного типа

Пожалуйста, смотрите следующий фрагмент кода ниже:

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, и это работает, но я буду благодарен, если есть способ использовать кортеж.

Примечание: я не могу использовать [](){} обозначение из-за версии компилятора.

0

Решение

Хорошо, я не знаю о повышении, но с лямбдами 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");
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]