Нижче подано наступний фрагмент коду:
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");