如何将引用绑定到常量参数或新对象



假设我有这样的代码:

void MyFunc(const std::string& param) {
std::string maybe_altered_param;
if (ConditionIsMet()) {
maybe_altered_param = AlterParam(param);
} else {
maybe_altered_param = param; // <-- unnecessary copy 
}
// do stuff with maybe_altered_param
// maybe_altered_param does not need to be modified further.
}

AlterParam函数返回字符串的副本,因此当ConditionIsMet返回true时,会生成一个副本以填充maybe_altered_param。然而,当ConditionIsMet()返回false时,也会进行复制,这是次优的。在第二种情况下,我只想为同一个对象有另一个名称,没有副本或任何类似的东西

在这种情况下,删除不必要的副本最简单的方法是什么?

我认为您关于引用绑定的问题被误导了。它正在寻找一种语言解决方案来解决本质上是一个代码组织问题。

你想"用maybe_altered_param做一些事情",您不想在每个分支中重复的内容(因为DRY代码是最好的代码(。那么,为什么不重构那个比特呢?

static void MyFuncImpl(const std::string& maybe_altered_param) {
// do stuff with maybe_altered_param
}
void MyFunc(const std::string& param) {
if (ConditionIsMet()) {
MyFuncImpl(AlterParam(param));
} else {
MyFuncImpl(param);
}
}

很简单。只有在满足条件时才会进行额外的复制,并且我们使用maybe_altered_param所做的事情只拼写一次,并由该参数参数化。

可能不是你想要的答案,但我认为这值得考虑。

使用额外的变量,您可以执行以下操作:

void MyFunc(const std::string& param) {
std::string maybe_altered_param;
const bool condition_met = ConditionIsMet();
if (condition_met) {
maybe_altered_param = AlterParam(param);
}
const std::string& ref =
condition_met ? maybe_altered_param : param; // both are lvalues, so no copy.
// do stuff with ref
}

最新更新