C ++ gleiche Funktionsparameter mit unterschiedlichem Rückgabetyp

8

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.

    
Josh Johnson 12.02.2013, 19:24
quelle

9 Antworten

20

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:

%Vor%

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:

%Vor%

wobei Value wie folgt implementiert ist:

%Vor%

Dann könnten Sie das schreiben:

%Vor%

Welches ist was du willst, oder?

    
Nawaz 12.02.2013 19:29
quelle
1

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%     
HackyStack 12.02.2013 19:31
quelle
1

Ob es sich um eine Überladung oder eine Spezialisierung handelt, Sie benötigen die Informationen in der Funktionssignatur. Sie könnten die Variable als ungenutztes 2. Argument übergeben:

%Vor%     
Robᵩ 12.02.2013 19:37
quelle
1

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%     
Walter 12.02.2013 22:30
quelle
0

Leider gibt es keine Möglichkeit, den Funktionsrückgabetyp zu überladen, siehe diese Antwort Überladen nach Rückgabetyp

    
Twiltie 12.02.2013 19:30
quelle
0
%Vor%

gibt eine Zeichenfolge zurück.

    
Ricardo Ortega Magaña 12.02.2013 19:30
quelle
0

Der einzig vernünftige Weg ist, den Rückgabewert auf die Parameter zu verschieben.

%Vor%     
user283145 12.02.2013 19:33
quelle
0

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.

    
Simon 12.02.2013 19:31
quelle
-2

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.

    
Seth Carnegie 12.02.2013 19:54
quelle

Tags und Links