如何使用单个返回语句返回对变量的引用
How to return reference to variable with single return statement
请考虑以下代码片段。
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;
}
笔记
返回的变量具有全局作用域(它在嵌入式系统上(。
该函数用作类中的方便方法,用途/范围非常有限。
您的引用绑定到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;
}
如果您希望函数在添加更多变量的同时保持可读性,我不鼓励使用引用/三元运算符。指针将是要走的路。
MyType_t& Variable(int i)
{
MyType_t* var = &MyDefaultVariable;
if (0 == i)
var = &MyVariable0;
else if (1 == i)
var = &MyVariable1;
return *var;
}
您可以使用条件运算符:
MyType_t& Variable(int i) {
return ( i==0 ) ? MyVariable0 : ( i==1) ? MyVariable1 : MyDefaultVariable;
}
但是,恕我直言,强迫您编写不可读代码的编码标准不值得称为"编码标准"。
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;
}
相关文章:
- 如何返回变量而不是变量的数值
- 函数,返回变量c++占用的内存位置的大小
- C++中局部变量和返回变量的构造和析构
- 我们如何在范围消失时通过引用返回变量
- 沿枚举 c++ 返回变量类型
- 在 Py_BuildValue 中返回变量字符串
- 递归返回语句无法正确返回变量
- 返回变量为 void (*)(void)
- 地址运算符是否返回变量引用的对象的地址
- 从函数返回变量地址时如何修复"与局部变量关联的堆栈内存地址"?
- 如何访问Python中编译的多个返回变量
- Binary_search通过其成员函数的返回变量[C ]找到类对象
- C++函数中声明和返回变量,并在主函数中使用它
- 从 C++ 返回对对象的引用时,是否需要在返回变量中使用 "&" 运算符?
- 函数返回看似随机的数字,而不是返回变量的值
- 从函数返回变量的链表
- 通过函数参数中的引用返回变量
- C++动态内存分配.将动态分配的 char* 返回变量数组分配给 char 变量
- 传递或返回变量时并不总是调用复制构造函数
- 尝试在模板 c++ 中返回变量时出错