Я просто прочитал код для 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;
}
и не видел серьезных оснований для этой шаблонной функции для возврата функции ввода. У кого-либо есть какие-либо примеры того, где это было бы полезно?
Это позволяет вам накапливать состояние в вашей функции, а затем возвращать его в код вызова. Например, ваша функция (как класс functor) может иметь член int для подсчета количества раз, когда она была вызвана.
Вот страница с примерами : http://xenon.arcticus.com/c-morsels-std-for-each-functors-member-variables
Возвращение функции в основном превращает std::for_each
в посредственную имитацию std::accumulate
. Это позволяет аккумулировать что-то в функции/функторе, а затем, когда это сделано, получить это накопленное значение. Практически в любой момент, когда Вам кажется, что это может быть полезно, стоит подумать об использовании std::accumulate
вместо этого.
Я не думаю, что по какой-либо конкретной причине. Что вы можете сделать, так это использовать возвращенную функцию в другом вызове foreach, избегая, таким образом, записи имени функции дважды и, возможно, сделать ошибку там.
-121--1353143-Я нашел много хороших видео о разработке программного обеспечения (и другие темы программирования) в dimecasts . Все они довольно короткие (~ 10 минут).
Имеется тэг узоров .
Примечание:
dimecasts.net кажется мертвой сейчас - ссылки были обновлены до archive.org, хотя видео, кажется, требуют вспышки (я не смог проверить, есть ли они).
-121--3320696-Если передается объект функции, или функтор, и он имеет состояние, возврат объекта функции позволяет получить доступ к его состоянию после итерации последовательности. Допустим, у вас был объект функции, который вычисляет три различные переменные из последовательности и удерживает их в члене переменных. При каждом вызове функтора выполняется обновление счетчиков. Если бы for_each не вернул объект, как бы вы получили результат?
Примечание... поэтому необходимо всегда внедрять функцию copy-construction и присваивать объекты функций с состоянием.
полезен, если вы хотите сохранить (и позже использовать) состояние functor между вызовами, например, подсчитать количество элементов в коллекциях или указать на некоторый сбой в обработке элемента, установив какую-либо внутреннюю переменную.
Ничего особенного. Хотя можно использовать возвращаемую функцию при другом форвардном вызове, избегая тем самым повторной записи имени функции и, возможно, допустив там ошибку.