Spécifier un pointeur vers des fonctions surchargées
Dans le domaine du C, il n'est pas rare de rencontrer des fonctions surchargées qui partagent le même nom mais diffèrent par leurs paramètres d’entrée. Cela présente un défi lorsque l'on tente de transmettre de telles fonctions comme arguments à des algorithmes génériques tels que std::for_each().
Fonctions surchargées imbriquées dans une classe
Considérez ce qui suit exemple, où la surcharge se produit au sein d'une classe :
class A { public: void f(char c); void f(int i); void scan(const std::string& s) { std::for_each(s.begin(), s.end(), f); } };
Ici, appeler la méthode scan() avec une chaîne quitte le compilateur je ne sais pas quelle implémentation de f utiliser. Par défaut, f() prendra un caractère comme argument. Cependant, l'utilisateur peut avoir l'intention d'utiliser la surcharge qui accepte un entier.
Affectation explicite du pointeur
Pour lever cette ambiguïté, il est possible de spécifier explicitement la surcharge souhaitée using static_cast<>() :
// Uses the void f(char c); overload std::for_each(s.begin(), s.end(), static_cast<void (*)(char)>(f)); // Uses the void f(int i); overload std::for_each(s.begin(), s.end(), static_cast<void (*)(int)>(f));
En convertissant le pointeur de fonction vers le type approprié, vous pouvez indiquer explicitement au compilateur quelle surcharge doit être appelée.
Méthode alternative utilisant des pointeurs de fonction
Une autre approche consiste à déclarer explicitement les pointeurs de fonction :
// The compiler will figure out which f to use according to // the function pointer declaration. void (*fpc)(char) = &f; std::for_each(s.begin(), s.end(), fpc); // Uses the void f(char c); overload void (*fpi)(int) = &f; std::for_each(s.begin(), s.end(), fpi); // Uses the void f(int i); overload
En créant des pointeurs de fonction avec des signatures spécifiques, le compilateur peut déterminer automatiquement la surcharge correcte à utiliser.
Membre Gestion des fonctions
Si la fonction surchargée est une fonction membre, une approche différente est nécessaire. Pensez à utiliser le modèle mem_fun ou reportez-vous à des ressources supplémentaires, telles que l'article du Dr Dobb lié dans la réponse fournie.
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!