Voy a ir a contracorriente aquí.
En C, los punteros de función son la única forma de implementar la personalización, porque no hay OO.
En C ++, puede usar punteros de función o functores (objetos de función) para el mismo resultado.
Los functores tienen una serie de ventajas sobre los punteros de función en bruto, debido a su naturaleza de objeto, en particular:
- Pueden presentar varias sobrecargas del
operator()
- Pueden tener estado / referencia a variables existentes
- Pueden construirse in situ (
lambda
y bind
)
Personalmente, prefiero functores a punteros de función (a pesar del código repetitivo), principalmente porque la sintaxis de los punteros de función puede complicarse fácilmente (del Tutorial de puntero de función ):
typedef float(*pt2Func)(float, float);
// defines a symbol pt2Func, pointer to a (float, float) -> float function
typedef int (TMyClass::*pt2Member)(float, char, char);
// defines a symbol pt2Member, pointer to a (float, char, char) -> int function
// belonging to the class TMyClass
La única vez que he visto usar punteros de función donde los functors no podían fue en Boost.Spirit. Han abusado completamente de la sintaxis para pasar un número arbitrario de parámetros como un solo parámetro de plantilla.
typedef SpecialClass<float(float,float)> class_type;
Pero dado que las plantillas variadas y lambdas están a la vuelta de la esquina, no estoy seguro de que usemos punteros de función en código C ++ puro por mucho tiempo.