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
Linda Hamiltonoriginal
2024-12-17 07:00:261001parcourir

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!
    }
};

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));

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

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!

Déclaration:
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