Heim > Backend-Entwicklung > C++ > Wie löst man Mehrdeutigkeiten bei der Übergabe überladener Funktionen an std::for_each()?

Wie löst man Mehrdeutigkeiten bei der Übergabe überladener Funktionen an std::for_each()?

Linda Hamilton
Freigeben: 2024-12-17 07:00:26
Original
999 Leute haben es durchsucht

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

Übergabe überladener Funktionen an std::for_each()

Beim Arbeiten mit überladenen Funktionen in C kann es vorkommen, dass Sie auf Situationen stoßen, in denen dies erforderlich ist Übergeben Sie eine dieser Überladungen an einen Algorithmus wie std::for_each(). Der Compiler bestimmt jedoch möglicherweise nicht automatisch die richtige aufzurufende Überladung basierend auf dem Typ des Iterators.

Beispiel:

Betrachten Sie die folgende Klasse mit zwei überladenen f ()-Funktionen:

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!
    }
};
Nach dem Login kopieren

Der Compilerfehler entsteht, weil der Aufruf von f() mehrdeutig ist. Um dieses Problem zu beheben, müssen Sie explizit angeben, welche Überladung Sie verwenden möchten.

Lösung 1: Verwenden von static_cast<>()

Eine Möglichkeit, dies zu tun, ist um static_cast<>() zu verwenden, um den Funktionszeiger wie gezeigt in die entsprechende Signatur umzuwandeln unten:

// 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));
Nach dem Login kopieren

Lösung 2: Zeigerdeklarationen

Alternativ können Sie Zeigerdeklarationen verwenden, die implizit die Funktionssignatur angeben. Dieser Ansatz ermöglicht es dem Compiler, automatisch die richtige Überladung abzuleiten, um Folgendes aufzurufen:

// 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
Nach dem Login kopieren

Memberfunktionen

Wenn die f()-Funktion eine Memberfunktion ist, werden Sie dies tun Sie müssen mem_fun verwenden oder sich auf die in diesem Artikel von Dr. Dobb besprochene Lösung beziehen.

Das obige ist der detaillierte Inhalt vonWie löst man Mehrdeutigkeiten bei der Übergabe überladener Funktionen an std::for_each()?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage