Посмотрел реализацию std::for_each и стало жутко интересно, почему данная функция возвращает функцию, которую мы передаём в 3-ем параметре? Это как-то используется?
Ответ
Если в качестве третьего параметра вы используете функциональный объект, вы можете наделить этот функциональный объект внутренним состоянием и накапливать в нем какой-то интересующий вас результат. Затем, по завершении std::for_each, этот результат можно будет извлечь из возвращенной копии объекта.
Например
#include
struct S
{
int sum = 0;
void operator()(int i) { sum += i; }
};
int main(void)
{
int a[] = { 1, 2, 3, 4, 5 };
std::cout << std::for_each(std::begin(a), std::end(a), S()).sum << std::endl;
}
Ситуацию также можно рассмотреть с точки зрения той же дизайн-идиомы, которая присутствует в классических С-функциях типа strcpy, т.е. передаваемое "насквозь" значение можно также использовать для более компактной (сцепленной) записи последовательных вызовов std::for_each с одним и тем же (с точки зрения значения) функциональным объектом
int main(void)
{
int a[] = { 1, 2, 3, 4, 5 };
int b[] = { 6, 7, 8, 9, 10 };
int c[] = { 11, 12, 13, 14, 15 };
std::cout <<
std::for_each(std::begin(c), std::end(c),
std::for_each(std::begin(b), std::end(b),
std::for_each(std::begin(a), std::end(a), S()))).sum << std::endl;
}
Комментариев нет:
Отправить комментарий