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