He encontrado algunos buenos ejemplos de functors en SO como this uno, y todos los ejemplos convincentes parecen usar el estado en la clase que define operator()
.Motivo para utilizar esta clase sin estado con un operador de llamada a función vs una función de estilo c?
Encontré un ejemplo en un libro que define el operador de llamada a función sin tener estado, y no puedo evitar sentir que esto es un uso incómodo, y que un puntero de función de estilo normal, sería mejor que usar operator()
en todos los sentidos aquí - menos código, menos variables (tiene que crear instancias de los comparadores), es probablemente más eficiente debido a la instanciación, y no hay pérdida de significado o encapsulación (ya que es solo una función).
Sé std::sort
le permite elegir entre las clases y funciones de operator()
, pero siempre acabo de utilizar las funciones debido a la lógica anterior.
¿Cuáles son las razones por las que una clase podría preferirse?
Aquí está el ejemplo (parafraseado):
class Point2D {
//.. accessors, constructors
int x,y;
};
class HorizComp {
public:
bool operator()(const Point2D& p, const Point2D& q) const
{ return p.getX() < q.getX(); }
};
class VertComp {
public:
bool operator()(const Point2D& p, const Point2D& q) const
{ return p.getY() < q.getY(); }
};
template <typename E, typename C>
void printSmaller(const E& p, const E& q, const C& isLess) {
cout << (isLess(p, q) ? p : q) << endl; // print the smaller of p and q
}
//...
// usage in some function:
Point2D p(1.2, 3.2), q(1.5, 9.2);
HorizComp horizComp;
VertComp vorizComp;
printSmaller(p, q, horizComp);
printSmaller(p, q, vorizComp);
fresco, yo no pienso en eso. Encontré una publicación de blog que muestra el rendimiento en línea en acción: http://codeforthought.blogspot.com/2011/07/performance-functors-vs-functions.html –
Debo admitir que veo esto como un problema de compilación. He visto problemas similares con la creación de líneas y el compilador no pudo desvirtualizar las llamadas como resultado. Me parece que esto es algo que debe lograr una propagación constante pulida (siempre que, en este caso, la definición de 'less_than' sea visible). –
@MatthieuM .: Definitivamente es un problema de compilación. Es por eso que utilicé los términos "más difícil", "más fácil", etc. No hay una razón fundamental por la que el compilador * no * genere instancias separadas para ambos predicados como funciones y todavía en línea sus cuerpos. Es solo que, por razones prácticas, los implementadores del compilador podrían no haber (todavía) hecho un caso especial para esta situación. –