Vado controcorrente qui.
In C, i puntatori a funzione sono l'unico modo per implementare la personalizzazione, perché non c'è OO.
In C ++ è possibile utilizzare puntatori a funzione o funtori (oggetti funzione) per lo stesso risultato.
I funtori hanno una serie di vantaggi rispetto ai puntatori a funzione grezza, a causa della loro natura oggetto, in particolare:
- Possono presentare diversi sovraccarichi di
operator()
- Possono avere stato / riferimento a variabili esistenti
- Possono essere costruiti sul posto (
lambda
e bind
)
Personalmente preferisco i funtori ai puntatori a funzione (nonostante il codice boilerplate), soprattutto perché la sintassi per i puntatori a funzione può facilmente diventare confusa (dal tutorial del puntatore di funzione ):
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
L'unica volta che ho mai visto puntatori a funzione utilizzati dove i funtori non potevano essere in Boost.Spirit. Hanno completamente abusato della sintassi per passare un numero arbitrario di parametri come un singolo parametro del modello.
typedef SpecialClass<float(float,float)> class_type;
Ma poiché modelli variadici e lambda sono dietro l'angolo, non sono sicuro che utilizzeremo puntatori a funzione nel codice C ++ puro per molto tempo.