Manchmal, wenn ich in C ++ programmiere, wünsche ich, dass es für jede Variable einen undefined
-Wert gibt, so etwas wie Javascript !.
Wenn ich zum Beispiel einen Wert für das Out-of-Bounds-Element eines Arrays zurücksende, war es nützlich, ein undefined
zurückzugeben, anstatt eine Ausnahme auszulösen, oder:
Eine andere schmutzige Option (Meiner Meinung nach) gibt eine Referenz einer vordefinierten Variable als schlechte Referenzvariable zurück. Ich weiß, dass wir null
oder etwas Ähnliches einer Referenzvariablen nicht zuordnen können.
Gibt es ein weiteres wohlgeformtes Muster, um eine Referenz zurückzugeben, bei der der Aufrufer die Möglichkeit hat, den zurückgegebenen Wert herauszufinden, nicht gültig?
BEARBEITEN: Ich meine nicht ein pointer
Sie können boost :: optional als @chris in seinem Kommentar erwähnt verwenden. Es kommt als Teil der Boost-Bibliothek. Weitere Informationen finden Sie auf dieser Seite .
Modifiziert MyArray
class:
Verwendung:
%Vor%Ich wünschte, es gäbe für jede Variable einen undefinierten Wert wie etwa Javascript!
Sie haben nur einen "undefinierten" Wert für Zeiger (nullptr). Eine Referenz ist (per Definition) etwas, das auf eine gültige Instanz verweist.
Um einen Verweis auf ein statisches Objekt zurückzugeben, sollten Sie zwischen konstanten und nicht konstanten Werten Ihres Operators unterscheiden:
%Vor%};
Was auch immer Sie denken, Ihre Lösung muss in das Typsystem passen. Also muss Ihre Funktionssignatur explizit (auf die eine oder andere Weise) sagen, dass das Ergebnis T sein kann, aber es kann auch etwas anderes sein.
Übliche Wege dafür sind:
Anstatt einen Wert zurückzugeben, geben Sie einen Statuscode zurück und geben den Wert über einen "out" -Parameter (einen Zeiger oder eine Referenz) aus:
%Vor%Liefert ein Tupel (Status, Wert) wie:
%Vor%(Wenn das zweite Tuple-Element nicht erhalten werden konnte, ist es irrelevant - T muss einen Standardkonstruktor haben)
Verwenden Sie boost::variant
(flexibel, erfordert jedoch Boost)
boost::optional
(einfachere Version von oben, wenn Sie nur "entweder T oder nichts" brauchen) Tags und Links c++