Лямбда-версия тоже не будет чище, но у нее есть еще одно важное преимущество: местность .Вы видите код, в котором вы его используете:
points.erase( std::remove_if( points.begin(), points.end(),
[](const Point2D& p){
return !p.isValid();
}), points.end() );
Обратите внимание, что вам нужно изменить isValid
, чтобы сделать его функцией const
, в противном случае вы не сможете вызвать ее для ссылки наconst (const Point2D&
).
Другим вариантом будет реализация operator!
для вашего класса:
class Point2D{
// ... as before
public:
bool isValid() const;
bool operator!() const{
return !isValid();
}
};
Обратите внимание, что обе функции являются константными.Теперь вы можете реализовать универсальный отрицательный функтор:
struct negate{
template<class T>
bool operator()(T const& t){
return !t;
}
};
И использовать это:
points.erase( std::remove_if( points.begin(), points.end(), negate()), points.end() );