Heim > Backend-Entwicklung > C++ > Wie kann ich einen Zeiger auf eine überladene Funktion in C angeben?

Wie kann ich einen Zeiger auf eine überladene Funktion in C angeben?

Barbara Streisand
Freigeben: 2024-12-30 05:03:08
Original
913 Leute haben es durchsucht

How Can I Specify a Pointer to an Overloaded Function in C  ?

Angeben eines Zeigers auf überladene Funktionen

Im Bereich C ist es nicht ungewöhnlich, auf überladene Funktionen zu stoßen, die denselben Namen haben, aber unterscheiden sich in ihren Eingabeparametern. Dies stellt eine Herausforderung dar, wenn versucht wird, solche Funktionen als Argumente an generische Algorithmen wie std::for_each() zu übergeben.

Verschachtelte überladene Funktionen innerhalb einer Klasse

Bedenken Sie Folgendes Beispiel, bei dem eine Überladung innerhalb einer Klasse auftritt:

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

    void scan(const std::string& s) {
        std::for_each(s.begin(), s.end(), f);
    }
};
Nach dem Login kopieren

Hier verlässt der Aufruf der scan()-Methode mit einer Zeichenfolge die Der Compiler ist sich nicht sicher, welche Implementierung von f verwendet werden soll. Standardmäßig akzeptiert f() ein Zeichen als Argument. Der Benutzer möchte jedoch möglicherweise die Überladung verwenden, die eine Ganzzahl akzeptiert.

Explizite Zeigerzuweisung

Um diese Mehrdeutigkeit aufzulösen, ist es möglich, die gewünschte Überladung explizit anzugeben using 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));
Nach dem Login kopieren

Indem Sie den Funktionszeiger in den entsprechenden Typ umwandeln, können Sie dies explizit angeben der Compiler, dessen Überladung aufgerufen werden soll.

Alternative Methode mit Funktionszeigern

Ein anderer Ansatz besteht darin, Funktionszeiger explizit zu deklarieren:

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

By Durch die Erstellung von Funktionszeigern mit bestimmten Signaturen kann der Compiler automatisch die richtige zu verwendende Überladung ermitteln.

Member-Funktion Handhabung

Wenn die überladene Funktion eine Mitgliedsfunktion ist, ist ein anderer Ansatz erforderlich. Erwägen Sie die Verwendung der mem_fun-Vorlage oder verweisen Sie auf zusätzliche Ressourcen, z. B. den Artikel von Dr. Dobb, der in der bereitgestellten Antwort verlinkt ist.

Das obige ist der detaillierte Inhalt vonWie kann ich einen Zeiger auf eine überladene Funktion in C angeben?. 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