Heim > Backend-Entwicklung > C++ > Wie kann man Mehrdeutigkeiten bei der Übergabe überladener Funktionszeiger in C beheben?

Wie kann man Mehrdeutigkeiten bei der Übergabe überladener Funktionszeiger in C beheben?

Barbara Streisand
Freigeben: 2024-12-24 11:16:11
Original
527 Leute haben es durchsucht

How to Resolve Ambiguity When Passing Overloaded Function Pointers in C  ?

Überladene Funktionszeiger in C

In C ist eine überladene Funktion eine Funktion mit mehreren Implementierungen mit unterschiedlichen Signaturen. Wenn eine überladene Funktion an einen generischen Algorithmus übergeben wird, kann es schwierig sein, anzugeben, welche Implementierung verwendet werden soll.

Betrachten Sie das folgende Beispiel:

class A {
    void f(char c);
    void f(int i);

    void scan(const std::string& s) {
        std::for_each(s.begin(), s.end(), f); // Overloaded function passed to 'for_each'
    }
};
Nach dem Login kopieren

Hier haben wir eine Klasse A mit zwei überladenen Memberfunktionen namens f, die jeweils ein char und ein int als Parameter annehmen. Die Scan-Mitgliedsfunktion von A versucht, den for_each-Algorithmus zu verwenden, um über eine Zeichenfolge zu iterieren, und ruft dabei die f-Funktion für jedes Zeichen auf.

Problem:

Allerdings der Compiler kann nicht automatisch bestimmen, welche Implementierung von f verwendet werden soll, wenn es an std::for_each übergeben wird. Dies liegt daran, dass der Algorithmus einen Funktionszeiger mit einer bestimmten Signatur erwartet und die überladenen Funktionssignaturen anhand des generischen Funktionszeigertyps nicht voneinander unterschieden werden können.

Lösung:

Um anzugeben, welche Überladung von f verwendet werden soll, können wir eine der folgenden Techniken anwenden:

1. Statische Umwandlung mit Funktionssignatur:

Wir können static_cast<>() verwenden, um den Funktionszeiger auf die spezifische Signatur umzuwandeln, die von std::for_each:

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

2. Deklaration von Funktionszeigern:

Alternativ können wir Funktionszeiger mit der gewünschten Signatur deklarieren und sie der überladenen Funktion zuweisen:

void (*fpc)(char) = &A::f; // Function pointer for void f(char c)
std::for_each(s.begin(), s.end(), fpc); // Uses the void f(char c); overload

void (*fpi)(int) = &A::f; // Function pointer for void f(int i)
std::for_each(s.begin(), s.end(), fpi); // Uses the void f(int i); overload
Nach dem Login kopieren

Für Mitgliedsfunktionen (optional) :

Wenn die überladene Funktion eine Mitgliedsfunktion ist, kann das Dienstprogramm mem_fun verwendet oder die bereitgestellte Lösung verwendet werden Im verlinkten Artikel von Dr. Dobb kann die gewünschte Überlastung angegeben werden.

Das obige ist der detaillierte Inhalt vonWie kann man Mehrdeutigkeiten bei der Übergabe überladener Funktionszeiger in C beheben?. 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