C++ gleiche Funktion Parameter mit unterschiedlichen Rückgabetyp
Muss ich einen Weg finden, zu verspotten, eine überladung einer Funktion Rückgabe-Typ in C++.
Ich weiß, dass es nicht eine Möglichkeit, das zu tun direkt, aber ich hoffe, es gibt einige out-of-the-box so sein.
Wir erstellen eine API für Benutzer, die arbeiten unter, und Sie werden Vorbeigehen in einen Daten-string, der ruft einen Wert basierend auf der string-Informationen. Diese Werte werden verschiedenen Arten. Kurzum, wir möchten, Sie tun zu lassen:
int = RetrieveValue(dataString1);
double = RetrieveValue(dataString2);
//Obviously, since they don't know the type, they wouldn't use int =.... It would be:
AnotherFunction(RetrieveValue(dataString1)); //param of type int
AnotherFunction(RetrieveValue(dataString2)); //param of type double
Aber das funktioniert nicht in C++ (offensichtlich).
Jetzt haben wir es so eingerichtet, dass Sie rufen:
int = RetrieveValueInt(dataString1);
double = RetrieveValueDouble(dataString2);
Wir jedoch nicht möchten, dass Sie wissen müssen, was die Art Ihrer Daten-string ist.
Leider sind wir nicht erlaubt die Verwendung von externen Bibliotheken, also nicht mit Boost.
Gibt es irgendwelche Möglichkeiten dies zu umgehen?
Nur um zu klären, ich verstehe, dass C++ nicht nativ tun es. Aber es muss einen Weg, um es. Zum Beispiel dachte ich über das tun RetrieveValue(dataString1, GetType(dataString1)). Dass nicht wirklich alles reparieren, weil GetType auch kann nur ein zurück geben. Aber ich brauche sowas.
Ich verstehe, dass diese Frage gestellt wurde, bevor, aber in einem anderen Sinn. Ich kann nicht Sie die offensichtlichen Antworten. Ich brauche etwas, was völlig out-of-the-box für Sie, um nützlich zu sein für mich, das war nicht der Fall mit einer der Antworten in der anderen Frage gefragt.
- Wie werden Sie wissen, welche Art zuordnen, um das Ergebnis der Funktion zu?
- Sie werden versuchen, zu Folgen ein schlechter Weg. Die verschiedenen Typen sind unterschiedliche Typen und verschiedene Funktionen verschiedene Funktionen. Diese Art von syntaktischen überladen wird keinen Mehrwert. Stattdessen wird es unnötig Komplex zu deinem code. Tun Sie es nicht.
- möglich, Duplikat der Puzzle: Überlast eine C++ - Funktion nach dem return-Wert
- Sie zeigen eine tatsächliche Art und Weise Sie wollen, dass diese Funktion aufgerufen werden? Und int x = RetrieveValue(...) Ist es nicht, weil Sie angeben, int, die für x, bricht eine Ihrer Bedingungen. Ich denke, diese Frage ist schlecht durchdacht.
- Ja, ich hab int = RetrieveValue(...) nur als einfaches Beispiel. Sie werden tatsächlich den Aufruf der Funktion innerhalb einer anderen Funktion. So könnte es sein: AnotherFunction(RetrieveValue(...),param);
- Diese Frage ist nicht beantwortbar in seiner aktuellen form, als pro Seths Kommentare. EDIT: Vielleicht Editiere deine Frage, um ein Beispiel von dem, was der echte code sieht wie auf dem Kommentar über mir?
- Es wird fügen Sie einige Komplikation, aber haben Sie sich Gedanken über die Besucher-Muster?
- Die Methode, die die akzeptierte Antwort auf das link @bo-persson kommentiert wäre der Weg, es zu tun. Allerdings wäre es besser, eine andere Methode verwenden, wenn möglich. also zurück ein Typ, der überladen hat benutzerdefinierte Konvertierung Operatoren.
- das funktioniert überhaupt nicht, weil er die Weitergabe der Rückgabewert in eine überladene Funktion. Diese Funktionalität kann nicht getan werden zur compile-Zeit.
- hatte nicht gesehen, dass Teil. Und auch die API-Teil - ich sicherlich würde nicht empfehlen, diese Technik für eine API. Kann nützlich sein, in einer property-system obwohl.
- Ich kann immer noch nicht sehen, dass der Teil in der Tat.
- Ich glaube, du bist mit der falschen Sprache. Tun Sie wirklich brauchen, um die Verwendung von C++ für das?
- siehe sein Kommentar stackoverflow.com/questions/14840173/...
- ich sehe jetzt.
- ist
dataString1
eine compile-Zeit-Konstante? oder eine Laufzeit-variable? - es ist eine Compilezeit-Konstante. Ein string, eine Referenz, die tiefer in das system bestimmt den Typ.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du hast, mit diesem zu starten:
Zur Unterstützung dieser Funktion, Sie habe die arbeiten ein wenig mehr, um zu konvertieren Sie den Wert in den Typ
T
. Eine einfache Möglichkeit zu konvertieren Wert könnte dies sein:Beachten Sie, dass Sie noch diese Funktion aufrufen wie:
Könnten Sie vermeiden, zu erwähnen
int
zweimal, wenn Sie dies tun könnte, statt:wo
Value
ist implementiert als:Dann könnte man dies schreiben:
die, die Sie wollen, richtig?
RetrieveValueInt
haben, werden Sie zu schreibenRetrieveValue<int>
, und ich sehe nicht viel Unterschied gibt es, mit Ausnahme der letzteren, die Fähigkeit zu generisch verwendet.int x =
sicherlich?if ( ss >> std::boolalpha >> convertedValue ) return convertedValue;
wenn T std::boolalpha und den rest der Zeit, ich möchte Sie einfachenif ( ss >> convertedValue ) return convertedValue;
auto
verarbeiten der Rückgabewerte vonRetrieveValue()
?Wenn Sie wissen, Ihr Wert kann nie so etwas wie null oder negativ, nur Rückgabe einer struct holding int und double und null heraus, die man nicht braucht...
Es ist Billig und schmutzig, sondern einfach Weg...
Ob es eine überlastung oder eine Spezialisierung, werden Sie die Informationen benötigen, um in die Funktion Unterschrift. Sie könnte übergeben Sie die variable als eine ungenutzte 2. argument:
Die einzige vernünftige Möglichkeit, dies zu tun ist, bewegen Sie den Rückgabewert an den Parameter.
Wenn die datastrings sind compile-Zeit-Konstanten (wie gesagt, bei der Beantwortung meiner Bemerkung), könnten Sie einige template-Magie, um die Arbeit zu tun. Eine noch einfachere Möglichkeit ist die Verwendung nicht-Zeichenfolgen auf alle, aber doch einige Datentypen, die es erlauben, Sie dann zu einer übersteuerung argument.
Leider gibt es keine Möglichkeit, um eine überlastung der Funktion zurück geben, Lesen Sie diese Antwort
Überlastung durch den Rückgabetyp
beide einen string zurückgeben.
Als alternative zu den template-Lösung, können Sie haben die Funktion eine Referenz oder einen Zeiger auf eine Klasse, dann erstellen Sie Unterklassen dieser Klasse enthalten die verschiedenen Datentypen, die Sie zurückgeben möchten.
RetrieveValue
würde dann wieder einen Verweis auf die entsprechende Unterklasse.Das wären dann lassen Sie den Benutzer übergeben Sie das zurückgegebene Objekt an andere Funktionen übergeben, ohne zu wissen, welche Unterklasse es sich gehörte.
Das problem in diesem Fall würden dann zu einer memory management -- die Wahl, welche Funktion weist das zurückgegebene Objekt und die Funktion löscht es, und wenn, in einer Weise, dass wir vermeiden von Speicherlecks.
Da Sie ein Beispiel, dass war nicht wirklich das, was Sie wollten, Sie warfen jeder ein bisschen off.
Setup Sie wirklich haben (den Aufruf einer Funktion mit dem Rückgabewert der Funktion, deren Rückgabetyp ist unerkennbar) wird nicht funktionieren, weil Funktionsaufrufe aufgelöst werden zur compile-Zeit.
Sind Sie dann beschränkt, um eine runtime-Lösung. Ich empfehle dem Besucher-Muster, und Sie haben Sie zu ändern, Ihre Gestaltung wesentlich zu ermöglichen, diese zu verändern. Es gibt nicht wirklich einen anderen Weg, es zu tun, dass ich sehen kann.
int x = f(str)
undf(g(str))
sind nicht mal in der Nähe der gleiche, wenn es um die Lösung, wie der Rückgabetyp. Wie ich schon sagte, es gibt keine Lösung für dein problem, wie gesagt, außer das, was ich schrieb in dieser Antwort. Downvoting wird sich nicht ändern diese Tatsache.f(g(str))
, der Programmierer braucht nicht zu wissen, das zurück geben, weilf
können überladen werden, für verschiedene Typen, und es macht alle vorgeschlagenen Lösungen nicht machbar. Wissen, was ich meine? Ich versuche nur zu helfen, Fragen Sie eine präzise Frage, die entspricht genau Ihren Bedürfnissen.