Хорошо, я боюсь, что вы выбрали ваш пример плохо, когда вы подобрали проблему подсчета ...
Проблема заключается в том, что for_each
является весьма общим и существуют более конкретные алгоритмы для конкретной реализации (count
, accumulate
, transform
, ...)
Итак, давайте возьмем еще один пример: for_each
обычно используется для применения мутирующей операции на объектах, которые он рассматривает. Это не мешает вам собирать статистику при этом.
Мы должны позаботиться, хотя for_each
действительно возвращает объект Predicate
, и нет гарантии, что этот объект использовался для каждого предмета в диапазоне. Реализация бесплатна, чтобы скопировать предикат вокруг и использовать копии на части диапазона ... так что копия, которую вы окончательно вернули, может быть удалена.
class Predicate
{
public:
Predicate(size_t& errors) : m_errors(errors) {}
void operator()(MyObject& o)
{
try { /* complicated */ } catch(unfit&) { ++m_errors; }
}
private:
size_t& m_errors;
};
std::vector<MyObject> myVec;
// fill myVec
size_t errors = 0;
std::for_each(myVec.begin(), myVec.end(), Predicate(errors));
Хитрость здесь в том, что все копии исходного предиката будет указывать на то же size_t
переменной, таким образом, эта переменная была правильно обновлена.
Не используйте для этого 'for_each'. Для этой цели существуют более совершенные алгоритмы. – jalf