当我们想要保持调用者状态时,围绕函数的包装器修改其参数

时间:2018-07-26 17:27:49

标签: c++ recursion pass-by-reference wrapper out-parameters

在围绕函数修改其参数(输出参数)的情况下创建包装器是一种好习惯吗?我们希望保持调用者的状态?

有没有更好的方法来实现这一目标?

下面的示例是一个递归函数,它将在每次递归时修改其参数。我们通过引用保存副本。问题在于它将修改呼叫者的状态,并且用户必须考虑这种副作用。

// Wrapper to return by value
// Example of caller
T1 data_1 = ...
T2 data_2 = ...

T3 result = foo(data_1, data_2);

T3 foo(T1 data_1, T2 data_2) // copy
{
    T3 result{};

    foo(data_1, data_2, result);

    return result;
}

void foo(T1 &data_1, T2 &data_2, T3 &result)
{
    // ...
    foo(data_1.modify(), data_2.modify(), result);
}

// Alternative, out parameter by reference, will modify data_1 and data_2
// Example of caller
T1 data_1 = ...
T2 data_2 = ...

T3 result{};

foo(data_1, data_2, result);



void foo(T1 &data_1, T2 &data_2, T3 &result)
{
    // ...
    foo(data_1.modify(), data_2.modify(), result);
}

1 个答案:

答案 0 :(得分:0)

很好,而且如果您在移动语义之前编写了代码,这种情况并不罕见,尤其是对于较旧的编译器而言,它在复制省略方面可能很弱。

您说的更清楚,通常可以很好地进行优化,并节省了在呼叫站点声明本地临时人员的工作。

如果您的类型不能移动或默认构造,则仍可以使用旧界面。