Ich werde hier gegen den Strom gehen.
In C sind Funktionszeiger die einzige Möglichkeit, die Anpassung zu implementieren, da kein OO vorhanden ist.
In C ++ können Sie entweder Funktionszeiger oder Funktoren (Funktionsobjekte) für dasselbe Ergebnis verwenden.
Die Funktoren haben aufgrund ihrer Objektnatur eine Reihe von Vorteilen gegenüber Rohfunktionszeigern, insbesondere:
- Sie können mehrere Überlastungen der
operator()
- Sie können Status / Verweis auf vorhandene Variablen haben
- Sie können vor Ort gebaut werden (
lambda
und bind
)
Ich persönlich bevorzuge Funktoren gegenüber Funktionszeigern (trotz des Boilerplate-Codes), hauptsächlich weil die Syntax für Funktionszeiger leicht haarig werden kann (aus dem Funktionszeiger-Tutorial ):
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
Das einzige Mal, dass ich Funktionszeiger gesehen habe, bei denen Funktoren nicht verwendet werden konnten, war in Boost.Spirit. Sie haben die Syntax völlig missbraucht, um eine beliebige Anzahl von Parametern als einzelnen Vorlagenparameter zu übergeben.
typedef SpecialClass<float(float,float)> class_type;
Da jedoch verschiedene Vorlagen und Lambdas vor der Tür stehen, bin ich mir nicht sicher, ob wir Funktionszeiger in reinem C ++ - Code schon lange verwenden werden.