Heim >Backend-Entwicklung >C++ >Kann eine Funktionsüberladung in C basierend auf dem Rückgabewert erreicht werden, und wenn ja, wie?
Einführung
Funktionsüberladung in C beinhaltet typischerweise die Differenzierung von Funktionen anhand ihrer Parametertypen . Es ist jedoch auch möglich, Funktionen anhand ihrer Rückgabewerte zu überladen. Dadurch können Sie Funktionen definieren, die je nach Verwendung unterschiedliche Datentypen zurückgeben.
Problemstellung
Betrachten Sie die folgende Aufgabe:
int n = mul(6, 3); // n = 18 std::string s = mul(6, 3); // s = "666"
Hier müssen Sie eine Funktion namens mul definieren, die je nach Rückgabewert entweder eine Ganzzahl oder eine Zeichenfolge zurückgibt verwendet.
Lösungsansätze
Explizite Typisierung:
Ein Ansatz besteht darin, die Aufrufe explizit durch Typisierung zu unterscheiden. Sie könnten beispielsweise zwei separate Funktionen definieren:
int mul(int, int); std::string mul(char, int);
Und sie wie folgt aufrufen:
int n = mul(6, 3); // n = 18 std::string s = mul('6', 3); // s = "666"
Dummy-Zeiger:
Andere Bei dieser Methode wird jeder Funktion ein Dummy-Parameter hinzugefügt, wodurch der Compiler gezwungen wird, den richtigen Parameter auszuwählen. Zum Beispiel:
int mul(int *, int, int); std::string mul(std::string *, char, int);
Und verwenden Sie sie mit:
int n = mul((int *) NULL, 6, 3); // n = 18 std::string s = mul((std::string *) NULL, 54, 3); // s = "666"
Vorlage des Rückgabewerts (Option 1):
Sie können erstellen eine „Dummy“-Funktion mit Code, der bei Instanziierung nicht kompiliert werden kann. Definieren Sie dann spezielle Vorlagenversionen für die gewünschten Rückgabetypen:
template<typename T> T mul(int, int); template<> int mul<int>(int, int); template<> std::string mul<std::string>(int, int);
Verwenden Sie sie wie folgt:
int n = mul<int>(6, 3); // n = 18 std::string s = mul<std::string>(54, 3); // s = "666"
Vorlagen für den Rückgabewert (Option 2):
Für Fälle mit unterschiedlichen Parametern können Sie separate Vorlagenspezialisierungen mit unterschiedlichen Parametern definieren Typen:
template<typename T> T mul(int, int); template<> int mul<int>(int, int); template<typename T> T mul(char, int); template<> std::string mul<std::string>(char, int);
Und nennen Sie sie als:
int n = mul<int>(6, 3); // n = 18 std::string s = mul<std::string>('6', 3); // s = "666"
Das obige ist der detaillierte Inhalt vonKann eine Funktionsüberladung in C basierend auf dem Rückgabewert erreicht werden, und wenn ja, wie?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!