【发布时间】:2019-01-03 18:46:30
【问题描述】:
为修改其参数(输出参数)的函数创建一个包装器并且我们希望保持调用者状态是一种好习惯吗?
有没有更好的方法来实现这一点?
以下示例是一个递归函数,它将在每次递归时修改其参数。我们通过引用来保存副本。问题是它会修改调用者状态,这个副作用必须由用户考虑。
// 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);
}
【问题讨论】:
标签: c++ recursion pass-by-reference wrapper out-parameters