シンク引数として渡された大量のデータを操作する関数があります。私のBigData
型は既に C++11 に対応しており、完全に機能するムーブ コンストラクターとムーブ代入の実装が付属しているため、いまいましいものをコピーする必要はありません。
Result processBigData(BigData);
[...]
BigData b = retrieveData();
Result r = processBigData(std::move(b));
これはすべて完全に正常に機能します。ただし、処理関数が実行時に失敗して例外が発生することがあります。問題を修正して再試行するだけなので、これは実際には問題ではありません。
BigData b = retrieveData();
Result r;
try {
r = processBigData(std::move(b));
} catch(std::runtime_error&) {
r = fixEnvironmnentAndTryAgain(b);
// wait, something isn't right here...
}
もちろん、これはうまくいきません。
データを処理関数に移動したため、例外ハンドラーに到達するまでにはb
使用できなくなります。
これにより、シンク引数を値で渡すことに対する私の熱意が大幅に低下する恐れがあります。
そこで質問があります: 最新の C++ コードでこのような状況に対処するにはどうすればよいでしょうか? 以前に実行に失敗した関数に移動されたデータへのアクセスを取得する方法は?
BigData
との両方の実装とインターフェースを好きなように変更processBigData
できます。ただし、最終的な解決策では、効率と使いやすさに関する元のコードの欠点を最小限に抑える必要があります。