如何将引用绑定到 const 参数或新对象?
How to bind a reference to either a const param or a new object?
假设我有这个代码:
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
函数returns复制字符串,所以当ConditionIsMet
returns为真时,复制一份以填充maybe_altered_param .
但是,当 ConditionIsMet()
returns 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
}
假设我有这个代码:
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
函数returns复制字符串,所以当ConditionIsMet
returns为真时,复制一份以填充maybe_altered_param .
但是,当 ConditionIsMet()
returns 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
}