Я недавно начал преподавать мне стандартную библиотеку шаблонов. Мне было любопытно относительно того, почему GetTotal () метод в этом классе возвращается 0?
...
class Count
{
public:
Count() : total(0){}
void operator() (int val){ total += val;}
int GetTotal() { return total;}
private:
int total;
};
void main()
{
set<int> s;
Count c;
for(int i = 0; i < 10; i++) s.insert(i);
for_each(s.begin(), s.end(), c);
cout << c.GetTotal() << endl;
}
for_each
берет функцию by-value. То есть, используется копия функтора, а не сам функтор. Ваш локальный c
остается неизменным.
for_each
возвращает использованный функтор, так что вы можете сделать:
Count c;
c = for_each(s.begin(), s.end(), c);
Или более идиоматично:
Count c = for_each(s.begin(), s.end(), Count());
Однако такая функциональность уже существует (нет необходимости в вашем функторе):
int total = std::accumulate(s.begin(), s.end(), 0);