我见过很多参数,使用返回值比输出参数更可取。我深信要避免它们的原因,但我发现自己不确定我是否遇到了不可避免的情况。
我的问题的第一部分是:您最喜欢/常用的使用 out 参数的方式有哪些?类似的东西:伙计,在同行评审中,我总是看到其他程序员这样做,而他们本来可以很容易地做到这一点。
我的问题的第二部分涉及我遇到的一些特定情况,我想避免使用 out 参数但想不出一种干净的方法来做到这一点。
示例 1:我有一堂课,我想避免使用昂贵的副本。可以在对象上完成工作,这会使对象的复制变得昂贵。建立数据的工作也不是微不足道的。目前,我将把这个对象传递给一个修改对象状态的函数。这对我来说比在工作函数内部新建对象并将其返回更可取,因为它允许我将东西保留在堆栈上。
class ExpensiveCopy //Defines some interface I can't change.
{
public:
ExpensiveCopy(const ExpensiveCopy toCopy){ /*Ouch! This hurts.*/ };
ExpensiveCopy& operator=(const ExpensiveCopy& toCopy){/*Ouch! This hurts.*/};
void addToData(SomeData);
SomeData getData();
}
class B
{
public:
static void doWork(ExpensiveCopy& ec_out, int someParam);
//or
// Your Function Here.
}
使用我的函数,我得到这样的调用代码:
const int SOME_PARAM = 5;
ExpensiveCopy toModify;
B::doWork(toModify, SOME_PARAM);
我想要这样的东西:
ExpensiveCopy theResult = B::doWork(SOME_PARAM);
但我不知道这是否可能。
第二个例子:我有一个对象数组。数组中的对象是一种复杂类型,我需要对每个元素进行处理,我希望将这些工作与访问每个元素的主循环分开。目前的代码如下所示:
std::vector<ComplexType> theCollection;
for(int index = 0; index < theCollection.size(); ++index)
{
doWork(theCollection[index]);
}
void doWork(ComplexType& ct_out)
{
//Do work on the individual element.
}
关于如何处理其中一些情况的任何建议?我主要使用 C++ 工作,但我很想看看其他语言是否有助于更轻松的设置。我遇到了 RVO 作为一种可能的解决方案,但我需要阅读更多关于它的内容,它听起来像是一个编译器特定的功能。