Je vais aller à contre-courant ici.
En C, les pointeurs de fonction sont le seul moyen d'implémenter la personnalisation, car il n'y a pas d'OO.
En C ++, vous pouvez utiliser des pointeurs de fonction ou des foncteurs (objets de fonction) pour le même résultat.
Les foncteurs présentent un certain nombre d'avantages par rapport aux pointeurs de fonction bruts, en raison de leur nature d'objet, notamment:
- Ils peuvent présenter plusieurs surcharges du
operator()
- Ils peuvent avoir un état / une référence à des variables existantes
- Ils peuvent être construits sur place (
lambda
et bind
)
Personnellement, je préfère les foncteurs aux pointeurs de fonction (malgré le code standard), principalement parce que la syntaxe des pointeurs de fonction peut facilement devenir poilue (à partir du didacticiel du pointeur de fonction ):
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 seule fois où j'ai vu des pointeurs de fonction utilisés là où les foncteurs ne pouvaient pas, c'était dans Boost.Spirit. Ils ont complètement abusé de la syntaxe pour passer un nombre arbitraire de paramètres en tant que paramètre de modèle unique.
typedef SpecialClass<float(float,float)> class_type;
Mais comme les modèles variadiques et les lambdas sont au coin de la rue, je ne suis pas sûr que nous utiliserons des pointeurs de fonction dans du code C ++ pur pour longtemps maintenant.