Я думаю, что Boost.Range заслуживает упоминания. Полученный код довольно близко к оригиналу:
#include <boost/range/adaptors.hpp>
// ...
using boost::adaptors::filtered;
auto filteredElements = elements | filtered([](decltype(elements)::value_type const& elm)
{ return elm.filterProperty == true; });
Единственным недостатком является необходимость явно объявить тип параметра лямбда в. Я использовал decltype (elements) :: value_type, потому что он избегает необходимости указывать точный тип, а также добавляет зерно общности. Кроме того, с 14 C++ в полиморфных лямбды, тип может быть просто определена как авто:
auto filteredElements = elements | filtered([](auto const& elm)
{ return elm.filterProperty == true; });
filteredElements будет диапазон, пригодный для обхода, но это в основном вид оригинального контейнера. Если то, что вам нужно, это еще один контейнер, заполненный копиями элементов, удовлетворяющих критериям (таким образом, что это не зависит от времени жизни оригинального контейнера), она может выглядеть следующим образом:
using std::back_inserter; using boost::copy; using boost::adaptors::filtered;
decltype(elements) filteredElements;
copy(elements | filtered([](decltype(elements)::value_type const& elm)
{ return elm.filterProperty == true; }), back_inserter(filteredElements));
ли это извлечь все элементы, которые 'filterProperty' установлено в' true'? –
Lambdas - это ключ – Paranaix
К сожалению, да. Некоторые общие критерии фильтра. – ATV