/ / lambda функція, що використовується для find_if, який порівнює елемент mapping типу комбінації - c ++, if-statement, find, предикат

Предикат lambda function, який використовується для find_if, який порівнює елемент карток типу compound - c ++, if-statement, find, предикат

Нижче подано наступний фрагмент коду:

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 to 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 і це працює, але я буду вдячний, якщо існує спосіб використання кортежу.

Сторона примітка: я не можу використати [](){} позначення через версію компілятора.

Відповіді:

2 для відповіді № 1

Добре, я не знаю про підвищення, але з 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");