Ich muss einen Weg finden, eine Überladung eines Funktionsrückgabetyps in C ++ nachzuahmen.
Ich weiß, dass es keinen Weg gibt, das direkt zu machen, aber ich hoffe, dass es einen Out-of-the-Box-Weg gibt. Wir erstellen eine API, unter der Benutzer arbeiten können. Sie übergeben eine Datenzeichenfolge, die basierend auf den Zeichenfolgeninformationen einen Wert abruft. Diese Werte sind verschiedene Arten. Im Wesentlichen möchten wir sie tun lassen:
%Vor%Aber das funktioniert natürlich nicht in C ++. Im Moment haben wir es eingerichtet, so dass sie anrufen:
%Vor%Wir wollen jedoch nicht, dass sie wissen müssen, was der Typ ihrer Datenfolge ist.
Leider dürfen wir keine externen Bibliotheken verwenden, also keine Boost.
Gibt es irgendwelche Möglichkeiten, wie wir das umgehen können?
Nur um zu verdeutlichen, verstehe ich, dass C ++ es nicht nativ machen kann. Aber es muss einen Weg geben, um es zu umgehen. Zum Beispiel dachte ich über RetrieveValue (dataString1, GetType (dataString1)). Das behebt nichts wirklich, weil GetType auch nur einen Rückgabetyp haben kann. Aber ich brauche so etwas.
Ich verstehe, dass diese Frage schon einmal gestellt wurde, aber in einem anderen Sinn. Ich kann keine der offensichtlichen Antworten verwenden. Ich brauche etwas, das völlig out-of-the-box ist, damit es für mich nützlich ist, was bei keiner der Antworten in der anderen Frage der Fall war.
Sie müssen damit beginnen:
%Vor% Um diese Funktion zu unterstützen, müssen Sie ein wenig mehr arbeiten, um den Wert in den Typ T
zu konvertieren. Eine einfache Möglichkeit zur Wertumwandlung könnte dies sein:
Beachten Sie, dass Sie diese Funktion immer noch wie folgt aufrufen müssen:
%Vor% Sie könnten vermeiden, int
zweimal zu erwähnen, wenn Sie dies stattdessen tun könnten:
wobei Value
wie folgt implementiert ist:
Dann könnten Sie das schreiben:
%Vor%Welches ist was du willst, oder?
Wenn Sie wissen, dass Ihr Wert niemals etwas wie Null oder Negativ sein kann, geben Sie einfach eine Struktur zurück, die int enthält, und verdoppeln und löschen Sie die, die Sie nicht brauchen ...
Es ist ein billiger und dreckiger, aber einfacher Weg ...
%Vor%Wenn die Datastrings Kompilierzeitkonstanten sind (wie bei der Beantwortung meines Kommentars angegeben), könnten Sie einige Template-Zauber verwenden, um die Aufgabe zu erledigen. Eine noch einfachere Option besteht darin, keine Strings zu verwenden, sondern einige Datentypen, die es Ihnen dann erlauben, das Argument zu überladen.
%Vor%Leider gibt es keine Möglichkeit, den Funktionsrückgabetyp zu überladen, siehe diese Antwort Überladen nach Rückgabetyp
Der einzig vernünftige Weg ist, den Rückgabewert auf die Parameter zu verschieben.
%Vor% Alternativ zur Vorlagenlösung können Sie die Funktion veranlassen, eine Referenz oder einen Zeiger auf eine Klasse zurückzugeben und dann Unterklassen dieser Klasse so zu erstellen, dass sie die verschiedenen Datentypen enthalten, die Sie zurückgeben möchten. RetrieveValue
würde dann einen Verweis auf die entsprechende Unterklasse zurückgeben.
Damit kann der Benutzer das zurückgegebene Objekt an andere Funktionen übergeben, ohne zu wissen, zu welcher Unterklasse es gehört.
Das Problem in diesem Fall würde dann einer der Speicherverwaltung werden - wählen, welche Funktion das zurückgegebene Objekt zuweist und welche Funktion löscht es, und wann, so dass wir Speicherlecks vermeiden.
Da du ein Beispiel benutzt hast, das nicht wirklich das war, was du wolltest, hast du alle etwas abgeworfen.
Das Setup, das Sie wirklich haben (das Aufrufen einer Funktion mit dem Rückgabewert dieser Funktion, deren Rückgabetyp unbekannt ist) funktioniert nicht, da Funktionsaufrufe zur Kompilierungszeit aufgelöst werden.
Sie sind dann auf eine Runtime-Lösung beschränkt. Ich empfehle das Besuchermuster, und Sie müssen Ihr Design wesentlich ändern, um diese Änderung zu ermöglichen. Es gibt nicht wirklich einen anderen Weg, um das zu sehen.
Tags und Links c++ function types overloading