Utilisez std::function, sauf s'il y a une raison impérieuse de ne pas le faire
Lorsque vous travaillez avec des fonctions de rappel en C, le choix entre utiliser un Le pointeur de fonction de style C et la nouvelle fonction std::function peuvent être un sujet de débat. Examinons les avantages et les inconvénients de chaque option.
Pointeurs de fonction de style C :
std::function:
Quand utiliser std::function:
Dans la plupart des cas, std::function est le choix préféré. C'est plus flexible et évolutif que les pointeurs de fonction. Sauf problèmes de performances spécifiques, il est généralement recommandé d'utiliser std::function pour transmettre les rappels.
Quand utiliser les pointeurs de fonction :
Si les performances sont essentielles considération et la fonction de rappel n'a pas besoin de capturer de variables de contexte, alors un pointeur de fonction peut être une meilleure option. Cependant, ce scénario est relativement rare.
Troisième option : paramètre de modèle
Envisagez d'utiliser un paramètre de modèle si vous souhaitez que la fonction de rappel soit n'importe quel objet appelable. Cette approche offre de la flexibilité mais nécessite que la fonction externe soit implémentée dans l'en-tête.
Tableau récapitulatif :
Feature | Function Pointer | std::function | Template Parameter |
---|---|---|---|
Can capture context | No | Yes | Yes |
Call overhead | None | Small | None |
Can be inlined | No | No | Yes |
Can be stored in class member | Yes | Yes | No |
Implemented outside of header | Yes | Yes | No |
Supported without C 11 standard | Yes | No | Yes |
Readability | Poor | Good | Fair |
Conclusion :
En général, les avantages de std::function l'emportent sur ceux des pointeurs de fonction. Il est plus flexible, évolutif et lisible. Utilisez les pointeurs de fonction uniquement s'il existe un problème de performances spécifique ou si la fonction de rappel n'a pas besoin de capturer de variables de contexte.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!