使用頭boost/range/algorithm/find_if.hpp
和boost/range/adaptor/transformed.hpp
你可以使用:
auto it = boost::find_if(vec | boost::adaptors::transformed(
[](std::pair<int, SomeStruct>& p){ return p.second; }),Predicate);
我不知道的東西比[](std::pair<int, MyClass>& p){ return p.second; }
短。原始std::get<1>
在此上下文中不起作用,因爲它不是函子。使用此功能,並提升可以使用boost::phoenix::at_c<0>(boost::phoenix::arg_names::arg1)
獲取函數訪問對的first
成員和boost::lambda::bind(Predicate,boost::lambda::_1)
使Predicate
一起工作:但我的C++ 14編譯器還接受了表達[](auto& p){ return std::get<1>(p); }
或[](auto& p){ return p.second; }
更新::拉姆達的逗號操作符重載這兩個結合:
auto it = boost::find_if(vec, (boost::lambda::bind(Predicate,boost::lambda::_1),boost::phoenix::at_c<0>(boost::phoenix::arg_names::arg1)));
但我不會稱之爲「提高魔法」,它更像是使事情複雜不必要的。
我見過類似的東西使用boost :: arg1與std :: vector。我真的不知道arg1是如何工作的,但我想知道它是否可以用來適應std :: pair。 –
JobNick