Ich habe eine Funktion, die auf einem großen Teil der Daten arbeitet als ein Sink-Argument übergeben. Mein BigData
Typ ist bereits C++ 11-aware und kommt mit voll funktionsfähigem bewegen Konstruktor und Zuweisungs Implementierungen bewegen, so kann ich weg, ohne das verdammte Ding zu kopieren:Sink-Argumente und Verschieben Semantik für Funktionen, die fehlschlagen können (starke Ausnahme Sicherheit)
Result processBigData(BigData);
[...]
BigData b = retrieveData();
Result r = processBigData(std::move(b));
Das alles perfekt funktioniert gut. Meine Verarbeitungsfunktion kann jedoch gelegentlich zur Laufzeit fehlschlagen, was zu einer Ausnahme führt. Dies ist nicht wirklich ein Problem, da ich nur Sachen reparieren und wiederholen kann:
BigData b = retrieveData();
Result r;
try {
r = processBigData(std::move(b));
} catch(std::runtime_error&) {
r = fixEnvironmnentAndTryAgain(b);
// wait, something isn't right here...
}
Natürlich wird dies nicht funktionieren.
Seit ich meine Daten in die Verarbeitungsfunktion verschoben haben, werde ich b
nicht mehr verwendbar sein, wenn ich in der Ausnahmebehandler ankommen.
Dies droht meine Begeisterung für das Übergeben von Sinkargumenten nach Wert zu reduzieren.
Also hier ist die Frage: Wie mit einer Situation wie dieser in modernen C++ - Code umgehen? Wie kann der Zugriff auf Daten abgerufen werden, die zuvor in eine Funktion verschoben wurden, die nicht ausgeführt werden konnte?
Sie können die Implementierung und Schnittstellen für beide BigData
und processBigData
ändern, wie Sie möchten. Die endgültige Lösung sollte jedoch versuchen, Nachteile gegenüber dem ursprünglichen Code in Bezug auf Effizienz und Benutzerfreundlichkeit zu minimieren.
Wichtige Frage, enthält Ergebnis die verschobenen Ressourcen von b oder basiert nur darauf? – IdeaHat
@MadScienceDreams Das 'Ergebnis' wird nur aus' b' berechnet, es enthält _nicht_ einen Verweis auf oder eine Kopie des Originals 'b'. – ComicSansMS
@ComicSansMS Aber enthält es die verschobenen (im Gegensatz zu kopierten) Inhalte? – Potatoswatter