Ооо, все-таки не С++ :l_rotate:
10 лет как-раз прошло со времени принятия стандарта.
Функтор это обьект, выступающий в роли функции (одна из идиом STL),
например
class Printer
{
public:
void operator()(int i)
{
std::cout << i << std::endl;
}
}
void main()
{
Printer print;
print(1);
}
Сам по себе пример не очень выразителен, но вкупе со стандартной библиотекой положение меняется
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
template <class T>
class Summa
{
T summa;
public:
Summa(const T& initialValue) : summa(initialValue) {}
Summa(const Summa<T>& other) : summa(other.summa) {}
void operator()(const T& value) { summa += value; }
operator const T() { return summa; }
};
template <class T>
class Average
{
long elems;
Summa<T> summa;
public:
Average() : elems(0), summa(0) {}
void operator()(const T& value)
{
elems++;
summa(value);
}
operator const T() { return static_cast<T>(summa / static_cast<double>(elems)); }
};
void main()
{
vector<int> values;
for(int i = 0; i < 10; i++)
{
values.push_back(rand());
}
cout << "Values: ";
copy(values.begin(), values.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "Summa = ";
cout << for_each(values.begin(), values.end(), Summa<int>(0));
cout << endl;
cout << "Average = ";
cout << for_each(values.begin(), values.end(), Average<int>());
cout << endl;
}
Если интересно - читай