Maison > développement back-end > C++ > Comment résoudre l'ambiguïté de la fonction surchargée dans std::for_each() ?

Comment résoudre l'ambiguïté de la fonction surchargée dans std::for_each() ?

Barbara Streisand
Libérer: 2024-12-20 18:55:17
original
721 Les gens l'ont consulté

How to Resolve Overloaded Function Ambiguity in std::for_each()?

Pointeur vers une fonction surchargée dans l'algorithme std::for_each()

En C, il est possible d'avoir des fonctions avec le même nom mais des paramètres différents, appelées fonction surcharge. Cela peut introduire une ambiguïté lors du passage d'une fonction surchargée comme argument à une fonction telle que std::for_each().

Problème :

Considérez l'extrait de code suivant :

class A {
    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

Dans cet exemple, la méthode scan() tente de transmettre la fonction surchargée f() à std::for_each(). Cependant, le compilateur ne peut pas déterminer automatiquement quelle surcharge de f() utiliser.

Solution :

Pour spécifier la surcharge souhaitée, vous pouvez utiliser static_cast<>( ) ou le pointeur de fonction mem_fun().

Méthode 1 : 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 un type spécifique, vous forcez le compilateur à résoudre la surcharge en fonction de la signature de fonction donnée.

Méthode 2 : Mem_Fun()

Si f() est une fonction membre, vous pouvez utiliser le Pointeur de fonction mem_fun() :

std::for_each(s.begin(), s.end(), std::mem_fun(&A::f));
Copier après la connexion

Cette approche vous oblige à spécifier le nom de la classe et la surcharge, qui peuvent être plus verbeuses mais aussi plus flexibles.

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