我有一个函数可以对作为接收器参数传入的大量数据进行操作。我的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
。然而,最终的解决方案应该尽量减少原始代码在效率和可用性方面的缺陷。