gpt4 book ai didi

c++ - 如何避免out参数?

转载 作者:可可西里 更新时间:2023-11-01 17:30:12 31 4
gpt4 key购买 nike

我见过很多论点,认为使用返回值比输出参数更可取。我深信避免它们的原因,但我发现自己不确定我是否遇到了不可避免的情况。

第一部分 我的问题是:您最喜欢/常用的使用 out 参数的方法有哪些?沿线的东西:伙计,在同行评审中,我总是看到其他程序员这样做,而他们本可以通过这种方式轻松完成。

第二部分 我的问题涉及我遇到的一些特定情况,在这些情况下我想避免使用 out 参数但想不出一个干净的方法来做到这一点。

示例 1:我有一个类,我想避免使用昂贵的拷贝。可以在对象上完成工作,这会使对象的复制成本很高。建立数据的工作也不是微不足道的。目前,我会将这个对象传递给一个函数,该函数将修改对象的状态。对我来说,这比 new 工作函数内部的对象并将其返回更可取,因为它允许我将东西保存在堆栈中。

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 作为一种可能的解决方案,但我需要阅读更多关于它的内容,它听起来像是一个特定于编译器的功能。

最佳答案

我不确定您为什么试图避免在此处传递引用。几乎这些情况下存在传递引用语义。

代码

static void doWork(ExpensiveCopy& ec_out, int someParam);

我觉得非常好。

如果你真的想修改它,那么你有几个选择

  1. 移动 doWork 使其成为 ExpensiveCopy 的成员(你说你做不到,所以就这样了)
  2. 从 doWork 返回一个(智能)指针而不是复制它。 (你不想这样做,因为你想把东西放在堆栈上)
  3. 依赖 RVO(其他人指出几乎所有现代编译器都支持它)

关于c++ - 如何避免out参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2140841/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com