Maison > développement back-end > C++ > Comment résoudre l'ambiguïté lors du passage de fonctions surchargées à std::for_each() ?

Comment résoudre l'ambiguïté lors du passage de fonctions surchargées à std::for_each() ?

Linda Hamilton
Libérer: 2024-12-17 07:00:26
original
1005 Les gens l'ont consulté

How to Resolve Ambiguity When Passing Overloaded Functions to std::for_each()?

Passer des fonctions surchargées à std::for_each()

Lorsque vous travaillez avec des fonctions surchargées en C , vous pouvez rencontrer des situations où vous devez transmettez l'une de ces surcharges à un algorithme comme std::for_each(). Cependant, le compilateur peut ne pas déterminer automatiquement la surcharge correcte à invoquer en fonction du type de l'itérateur.

Exemple :

Considérons la classe suivante avec deux f surchargés () fonctions :

class A {
    void f(char c);
    void f(int i);

    void scan(const std::string& s) {
        std::for_each(s.begin(), s.end(), f); // Error!
    }
};
Copier après la connexion

L'erreur du compilateur survient car l'appel à f() est ambigu. Pour résoudre ce problème, vous devez spécifier explicitement la surcharge que vous avez l'intention d'utiliser.

Solution 1 : Utiliser static_cast<>()

Une façon de procéder est utiliser static_cast<>() pour convertir le pointeur de fonction vers la signature appropriée, comme indiqué ci-dessous :

// Uses the void f(char c); overload
std::for_each(s.begin(), s.end(), static_cast<void (*)(char)>(&amp;f));
// Uses the void f(int i); overload
std::for_each(s.begin(), s.end(), static_cast<void (*)(int)>(&amp;f));
Copier après la connexion

Solution 2 : Déclarations de pointeur

Vous pouvez également utiliser des déclarations de pointeur qui spécifient implicitement la signature de la fonction. Cette approche permet au compilateur de déduire automatiquement la surcharge correcte à appeler :

// The compiler will figure out which f to use according to
// the function pointer declaration.
void (*fpc)(char) = &amp;f;
std::for_each(s.begin(), s.end(), fpc); // Uses the void f(char c); overload
void (*fpi)(int) = &amp;f;
std::for_each(s.begin(), s.end(), fpi); // Uses the void f(int i); overload
Copier après la connexion

Fonctions membres

Si la fonction f() est une fonction membre, vous vous devez utiliser mem_fun ou vous référer à la solution discutée dans cet article du Dr Dobb.

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