Uno de los objetivos principales cuando se sobrecarga el operador() es crear un functor. Un functor actúa como una función, pero tiene las ventajas de que es estable, lo que significa que puede mantener los datos reflejando su estado entre llamadas.
Aquí está un ejemplo sencillo funtor:
struct Accumulator
{
int counter = 0;
int operator()(int i) { return counter += i; }
}
...
Accumulator acc;
cout << acc(10) << endl; //prints "10"
cout << acc(20) << endl; //prints "30"
Functors son muy utilizados en la programación genérica. Muchos algoritmos STL están escritos de una manera muy general, de modo que usted puede conectar su propia función/functor en el algoritmo. Por ejemplo, el algoritmo std :: for_each le permite aplicar una operación en cada elemento de un rango. Se podría implementar algo así:
template <typename InputIterator, typename Functor>
void for_each(InputIterator first, InputIterator last, Functor f)
{
while (first != last) f(*first++);
}
se ve que este algoritmo es muy genérico, ya que está parametrizada por una función. Al usar el operador(), esta función le permite usar un functor o un puntero de función. He aquí un ejemplo que muestra las dos posibilidades:
void print(int i) { std::cout << i << std::endl; }
...
std::vector<int> vec;
// Fill vec
// Using a functor
Accumulator acc;
std::for_each(vec.begin(), vec.end(), acc);
// acc.counter contains the sum of all elements of the vector
// Using a function pointer
std::for_each(vec.begin(), vec.end(), print); // prints all elements
En cuanto a su pregunta sobre el operador() sobrecarga, pues sí es posible. Puede escribir perfectamente un functor que tenga varios operadores de paréntesis, siempre que respete las reglas básicas de sobrecarga de métodos (por ejemplo, no es posible sobrecargar el tipo de devolución).
Relacionados http://stackoverflow.com/questions/356950/c-functors-and-their-uses? – Konrad