Objetos función


Las STL dan la siguiente definición de los objetos función:

"Los objetos función son objetos con el operador() definido... En los lugares donde uno podría pasar un puntero a función a un algoritmo patrón, el interfaz se ha especificado para aceptar objetos con el operador() definido."

Esta definición, aunque precisa, no da idea del amplio abanico de posibilidades de este tipo de objetos. Veamos un ejemplo de lo que podemos hacer utilizando objetos función:

//-----------------------------------------------------------------
// of01.cc
//-----------------------------------------------------------------

#include <iostream>
#include <stl.h>

//-----------------------------------------------------------------

template <class T> 
ostream& operator<<(ostream& os, const vector<T>& v)
{
  copy(v.begin(), v.end(), ostream_iterator<T>(os, " "));
  return os;
}

//-----------------------------------------------------------------

float cuadrado1(const float& x)
{
  return x * x;
}

template <class T> struct cuadrado2
{
  T operator()(const T& x) const { return x * x; }
};

//-----------------------------------------------------------------

main()
{
  vector<float> v(10);
  cout << "v = " << v << endl;
  
  iota(v.begin(), v.end(), 0.0);
  cout << "v = " << v << endl;

  vector<float> v2 = v;
  transform(v.begin(), v.end(), v2.begin(), cuadrado1);
  cout << "v2 = " << v2 << endl;

  vector<float> v3 = v;
  transform(v.begin(), v.end(), v3.begin(), cuadrado2<float>());
  cout << "v3 = " << v3 << endl;
}
    

En este programa se utiliza una función y un objeto función para calcular el cuadrado de los elementos de un vector. Como puede observarse ambas implementaciones son casi igual de simples e inmediatas, pero la segunda es más flexible que la primera porque permite su utilización con cualquier tipo dado que es un patrón.