我有一个函数,可以对作为接收器参数传入的大量数据进行操作。我的BigData
type 已经支持 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...
}
当然,这是行不通的。
Since I moved当我到达异常处理程序时,我的数据进入处理函数,b
将无法再使用。
这可能会大大降低我对按值传递接收器参数的热情。
那么问题来了:在现代 C++ 代码中如何处理这样的情况?如何检索对先前移至无法执行的函数中的数据的访问权限?
您可以更改两者的实现和接口BigData
and processBigData
如你所愿。然而,最终的解决方案应该尽量减少原始代码在效率和可用性方面的缺陷。
我同样对这个问题感到困惑。
据我所知,当前最好的习惯用法是将值传递划分为一对引用传递。
template< typename t >
std::decay_t< t >
val( t && o ) // Given an object, return a new object "val"ue by move or copy
{ return std::forward< t >( o ); }
Result processBigData(BigData && in_rref) {
// implementation
}
Result processBigData(BigData const & in_cref ) {
return processBigData( val( in_cref ) );
}
当然,在异常发生之前,参数的一些部分可能已经被移动了。问题会传播到任何地方processBigData
calls.
我有一个灵感,想要开发一个对象,在某些例外情况下,它可以自行返回其源头,但这是我的一个项目中即将出现的特定问题的解决方案。它最终可能过于专业化,或者根本不可行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)