Maison > développement back-end > C++ > Comment puis-je spécifier un pointeur vers une fonction surchargée en C ?

Comment puis-je spécifier un pointeur vers une fonction surchargée en C ?

Barbara Streisand
Libérer: 2024-12-30 05:03:08
original
912 Les gens l'ont consulté

How Can I Specify a Pointer to an Overloaded Function in C  ?

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);
    }
};
Copier après la connexion

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));
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal