Funktion mit verschiedenen return Typen möglich?
-
@Swordfish sagte in Funktion mit verschiedenen return Typen möglich?:
Huch? Wie ginge das dann?
Naja, woher soll der Compiler wissen, ob er den Destruktor von
f
oder den vonstr
ausführen soll? Du musst das von Hand machen (if (isString()) str.~string();
, urgh - oder so ähnlich)Ein Union-Beispiel mit int, float und string findet sich sogar im C++-Standard. In N4659 in Abschnitt 12.3 Absatz 4.
-
@wob Ach so, ja, das klingt logisch. Find' ich aber halb so schlimm.
-
@tecranovis
Das macht in deinem Fall keinen Sinn.
Entweder erschlägst du das über ein std::pair oder du überlegst dir was dein Rückgabewert "OK" eigentlich aussagt und ersetzt ihn vielleicht durch ein bool, falls er eigentlich nur aussagt "irgendwas hat hier gut funktioniert oder eben nicht".Die Funktion könnte dann auch so aussehen:
std::pair<double,bool> test( float a, float b ) { if ( a / b == 1 ) return std::make_pair( true, 0 ); else if ( b != 0 ) return std::make_pair( false, a / b ); else return std::make_pair( false, -1 ); // hier sind auch noch andere Arten der Fehlerrückgabe möglich ) }
Wenn du mehr als nur "true und false" aussagen willst, kannst du auch noch andere Datentype ( char, short, oder enums ) nutzen, um z.B. drei Aussagen zu treffen.
Die Hauptfrage ist also: Was willst du neben der Rückgabe des mathematischen Rechenergebnisses noch aussagen.
-
Hallo,
die Ausgaben landen in einer Datei, die von Personen betrachtet wird. Und da ist der Text "OK" einfach besser erfassbar als der Zahlenwert 1 denke ich.
Im nicht OK Fall wiederum ist im meimen Fall die Ausgabe des Quotienten aussagekräftiger.Man könnte das sicher auch irgedwie im cout direkt abfragen mit a/b==1? "OK": a/b aber da ich recht viele solcher Ausgaben habe wollte ich das irgenwie eleganter umsetzen.
Danke dir und den anderen Foristen für eure Zeit und Hilfe!
-
Wenn das Ganze in ´ner Datei landet, das Ergebnis nicht weiter verwendet wird und die Datei nur von anderen gelesen wird kannste auch sofort
std::string
benutzen. Wenn das Ergebnis nicht dem erwarteten Wert entspricht konvertierste das in ´nen string und gibst den zurück.
-
... oder Du schreibst direkt in der Funktion in die Datei. Wenn der weitere Programmverlauf vom Funktionsergebnis unabhängig ist, brauchst Du gar keinen Rückgabewert ...
-
@tecranovis
Alle bisherigen Antworten hatten zum Ziel, irgendwas zu basteln, damit eine Funktion 2 Werte zurück gibt.
Ich glaube niemand hier hätte dir das als Tipp gegeben, um eine Ausgabe zu formatieren.
Da kannst du doch besser eine Funktion nehmen:toStream(double value, std::ostream& os) { if(value ==1) os << "OK"; else os << value; } ...
-
@Jockelx sagte in Funktion mit verschiedenen return Typen möglich?:
@tecranovis
Alle bisherigen Antworten hatten zum Ziel, irgendwas zu basteln, damit eine Funktion 2 Werte zurück gibt.
Ich glaube niemand hier hätte dir das als Tipp gegeben, um eine Ausgabe zu formatieren.
Da kannst du doch besser eine Funktion nehmen:if(value ==1)
Ich hab gehört, mit solchen Vergleichen sollte man vorsichtig sein, wenn es um Fließkommazahlen geht ...
-
Ich habe gehört, dass man nicht eigenmächtig eigene/neue Logik einbaut, wenn man etwas in eine Funktion auslagert
-
@Jockelx @Belli Ich habe gehört, daß
a
undb
alsint
s übergeben werdenif (a == b) return "Ok";
also:
std::ostream& magic_div(std::ostream &os, int a, int b) { if (a == b) return os << "Ok"; return os << (a / static_cast<float>(b)); )
-
@Swordfish Du hast wohl richtig gehört!
Ich hab einfach nur nach oben gescrollt und den ersten Code (von @It0101 ) übernommen.
Im ersten Post steht aber was von int.Deine Funktion finde ich aber trotzdem nicht gut. Die komplizierte Berechnung (a/b) würde ich in einer eigenen Funktion machen und die stream-Ausgabe in einer Anderen (mit dem berechneten Wert).
-
@Jockelx Dann musst wieder mit einem epsilon rumspielen ...
-
@Swordfish Mmh, ja, ist auch doof. Stimmt schon.
-
@Jockelx sagte in Funktion mit verschiedenen return Typen möglich?:
Ich hab einfach nur nach oben gescrollt und den ersten Code (von @It0101 ) übernommen.
Nein. Der Code des TE enthält keinerlei Datentypen, nur den static_cast auf float. Die Ints sind eine Erfindung vom Aquarium-Insassen
-
Dieser Beitrag wurde gelöscht!
-
@tecranovis sagte in Funktion mit verschiedenen return Typen möglich?:
Looks great an extraordinary for a C++ newbie like me.
But unfortunately my compiler does not support <variant> which seems to be a relatively new extension of the C++ standard.A 'variant' is just a 'union' or 'structure' containing some types and also an id of which type is current. Unions and structs are actually relicts of the C ancestry of C++.
-
@RBS2 Ja, und wenn Du eine blanke
union
zurückgibst hat der aufrufende Code keinen Plan welcher member active ist. Troll dich.
-
@Swordfish sagte in Funktion mit verschiedenen return Typen möglich?:
@RBS2 Ja, und wenn Du eine blanke
union
zurückgibst hat der aufrufende Code keinen Plan welcher member active ist. Troll dich.Deshalb sollte diese Union z.B. Teil einer Struct sein, die anzeigt was gerade gilt. Stell dich doch nicht absichtlich dumm.
-
@RBS2 sagte in Funktion mit verschiedenen return Typen möglich?:
Deshalb sollte diese Union z.B. Teil einer Struct sein, die anzeigt was gerade gilt.
Was ja üüüüüüberhaupt nicht mein Lösungsvorschlag abseits
std::variant<>
war. Tell me more .... Du ziehst fast jeden Thread wo Du Dich "einbringst" absichtlich in die Scheiße.
-
Dieser Beitrag wurde gelöscht!