Почему делает станд.:: for_each (от, до, функция) возвращают функцию?

Я просто прочитал код для std::for_each:

template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f)
{
  for ( ; first!=last; ++first ) f(*first);
  return f;
}

и не видел серьезных оснований для этой шаблонной функции для возврата функции ввода. У кого-либо есть какие-либо примеры того, где это было бы полезно?

29
задан Dev Null 27 May 2019 в 05:48
поделиться

5 ответов

Это позволяет вам накапливать состояние в вашей функции, а затем возвращать его в код вызова. Например, ваша функция (как класс functor) может иметь член int для подсчета количества раз, когда она была вызвана.

Вот страница с примерами : http://xenon.arcticus.com/c-morsels-std-for-each-functors-member-variables

45
ответ дан 28 November 2019 в 01:24
поделиться

Возвращение функции в основном превращает std::for_each в посредственную имитацию std::accumulate. Это позволяет аккумулировать что-то в функции/функторе, а затем, когда это сделано, получить это накопленное значение. Практически в любой момент, когда Вам кажется, что это может быть полезно, стоит подумать об использовании std::accumulate вместо этого.

3
ответ дан 28 November 2019 в 01:24
поделиться

Я не думаю, что по какой-либо конкретной причине. Что вы можете сделать, так это использовать возвращенную функцию в другом вызове foreach, избегая, таким образом, записи имени функции дважды и, возможно, сделать ошибку там.

-121--1353143-

Я нашел много хороших видео о разработке программного обеспечения (и другие темы программирования) в dimecasts . Все они довольно короткие (~ 10 минут).

Имеется тэг узоров .


Примечание:

dimecasts.net кажется мертвой сейчас - ссылки были обновлены до archive.org, хотя видео, кажется, требуют вспышки (я не смог проверить, есть ли они).

-121--3320696-

Если передается объект функции, или функтор, и он имеет состояние, возврат объекта функции позволяет получить доступ к его состоянию после итерации последовательности. Допустим, у вас был объект функции, который вычисляет три различные переменные из последовательности и удерживает их в члене переменных. При каждом вызове функтора выполняется обновление счетчиков. Если бы for_each не вернул объект, как бы вы получили результат?

Примечание... поэтому необходимо всегда внедрять функцию copy-construction и присваивать объекты функций с состоянием.

2
ответ дан 28 November 2019 в 01:24
поделиться

полезен, если вы хотите сохранить (и позже использовать) состояние functor между вызовами, например, подсчитать количество элементов в коллекциях или указать на некоторый сбой в обработке элемента, установив какую-либо внутреннюю переменную.

2
ответ дан 28 November 2019 в 01:24
поделиться

Ничего особенного. Хотя можно использовать возвращаемую функцию при другом форвардном вызове, избегая тем самым повторной записи имени функции и, возможно, допустив там ошибку.

-4
ответ дан 28 November 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: