请考虑以下代码段。
MyType_t& Variable(int i) {
if (i == 0) {
return MyVariable0;
}
if (i == 1) {
return MyVariable1;
}
return MyDefaultVariable;
}
这将返回对变量的引用,然后可以对其进行修改。
Variable(1) = 10;
但是,我们的编码标准规定要使用单个返回点。我将如何完成?出于某种原因,即使我已经验证了将代码设置var
设置为适当变量的代码,下面的内容似乎也只会复制该值(因此不会返回对根变量的引用)。
使用指针将很简单,但是我只是无法正确获得引用。
MyType_t& Variable(int i) {
MyType_t& var = MyDefaultVariable;
if (i == 0) {
var = MyVariable0;
}
if (i == 1) {
var = MyVariable1;
}
return var;
}
注释
返回的变量具有全局范围(在嵌入式系统上)。
该函数用作类内部的便捷方法,用途/范围非常有限。
答案 0 :(得分:6)
您的参考已绑定到MyDefaultVariable
,以后您将无法对其进行修改,因为这是它的工作方式。您的var = MyVariable0;
有效地调用了MyDefaultVariable
的复制运算符,从而导致您观察到的行为。
如果您想避免在此处使用三元运算符,则可以使用与建议的内容相近的内容,但可以使用稍后在return语句中取消引用的指针。
MyType_t& Variable(int i) {
MyType_t* var = &MyDefaultVariable;
if (i == 0) {
var = &MyVariable0;
}
if (i == 1) {
var = &MyVariable1;
}
return *var;
}
答案 1 :(得分:4)
如果您希望函数在添加更多变量时保持可读性,则不建议使用引用/三元运算符。指针将是必经之路。
MyType_t& Variable(int i)
{
MyType_t* var = &MyDefaultVariable;
if (0 == i)
var = &MyVariable0;
else if (1 == i)
var = &MyVariable1;
return *var;
}
答案 2 :(得分:1)
您可以使用条件运算符:
MyType_t& Variable(int i) {
return ( i==0 ) ? MyVariable0 : ( i==1) ? MyVariable1 : MyDefaultVariable;
}
但是,强迫您编写不可读代码的编码标准不应该被称为“编码标准”恕我直言。
答案 3 :(得分:0)
std :: reference_wrapper将提供此功能,而不会使您暴露于原始指针的风险。使用reference_wrappers也会表达意图。
请注意,为std :: reference_wrapper分配新引用将导致包装器重新绑定,但不会覆盖所引用变量的内容。
#include <functional>
using MyType_t = int;
extern int& MyDefaultVariable;
extern int& MyVariable0;
extern int& MyVariable1;
MyType_t& Variable(int i) {
auto var = std::ref(MyDefaultVariable);
if (i == 0) {
var = MyVariable0;
}
if (i == 1) {
var = MyVariable1;
}
return var;
}
另一种表达方式是:
MyType_t& Variable(int i)
{
auto var = std::ref(MyDefaultVariable);
switch(i)
{
case 0: var = MyVariable0; break;
case 1: var = MyVariable0; break;
default: break;
}
return var;
}