Bence Boost.Range de bir sözü hak ediyor. Ortaya çıkan kod, orijinaline oldukça yakındır:
#include <boost/range/adaptors.hpp>
using boost::adaptors::filtered;
auto filteredElements = elements | filtered([](decltype(elements)::value_type const& elm)
{ return elm.filterProperty == true; });
Tek dezavantajı, lambda'nın parametre türünü açıkça bildirmek zorunda olmasıdır. Ben decltype (elements) :: value_type kullandım, çünkü tam türü hecelemek zorunda kalmaz ve aynı zamanda bir genellik zarı ekler. Alternatif olarak, C ++ 14'ün polimorfik lambdalarıyla, tür basitçe auto olarak belirtilebilir:
auto filteredElements = elements | filtered([](auto const& elm)
{ return elm.filterProperty == true; });
filteredElements, geçiş için uygun bir aralık olabilir, ancak temelde orijinal kabın bir görünümüdür. İhtiyacınız olan şey, kriterleri karşılayan öğelerin kopyalarıyla dolu başka bir kapsa (böylece orijinal kabın ömründen bağımsızdır), şöyle görünebilir:
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
ayarlanmış tüm öğeleri alır mıtrue
?