Ü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! } };
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)>(&f)); // Uses the void f(int i); overload std::for_each(s.begin(), s.end(), static_cast<void (*)(int)>(&f));
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) = &f; std::for_each(s.begin(), s.end(), fpc); // Uses the void f(char c); overload void (*fpi)(int) = &f; std::for_each(s.begin(), s.end(), fpi); // Uses the void f(int i); overload
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!