Я собираюсь уйти добровольно. Проблема с лямбдами заключается в том, что (кроме C ++ 0x) вы не можете использовать что-то вроде _.second
на данный момент.
Лично я, таким образом, использую:
template <class Second>
class CompareSecond
{
public:
CompareSecond(Second const& t) : m_ref(t) {} // actual impl use Boost.callparams
template <class First>
bool operator()(std::pair<First,Second> const& p) const { return p.second == m_ref; }
private:
Second const& m_ref;
};
С которыми я комбинирую:
template <class Second>
CompareSecond<Second> compare_second(Second const& t)
{
return CompareSecond<Second>(t);
}
Для получения автоматического вычета типа.
И так я могу написать
CMyList::iterator it = std::find_if(myList.begin(), myList.end(), compare_second(i));
Правда, он не использует связующие.
Но, по крайней мере, мой читабелен и легко понятен, что, по моему мнению, превосходит всякую хитрость в хитрой хитрости
Примечание
на самом деле я пошел так далеко, что обернул алгоритмы STL, чтобы получить полные контейнеры, так что это было бы:
CMyList::iterator it = toolbox::find_if(myList, compare_second(i));
, который (imho) явно читабелен, как вы можете получить без ключевого слова auto
для вывода типа.