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
Barbara Streisandoriginal
2024-12-20 18:55:17785parcourir

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

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

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

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!

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