int a = 1;
int b = 2;
int c = 3;
std::string TakeFrom = "a";
如何从 TakeFrom 中获取值,在本例中为 a,并读取这样命名的整数?例如,在上面的代码中,我必须读取 a 的值,因为“a”是 TakeFrom 包含的内容,所以我会得到“1”,但如果 TakeFrom 包含“b”,我会得到 b 的值 (2)。
在正常的 C/C++ 条件下,变量名仅在编译期间存在于其给定范围内,它们本质上是人类可读的助记符,用于引用特定的内存位置/寄存器。
C/C++ 具有最小化的反射功能,因此在运行时没有内置方法可以通过名称引用变量或通过变量的位置/值查找变量的名称。
要解决您所描述的问题,有几个简单的选项:
int value;
if (TakeFrom == "a") {
value = a;
} else if (TakeFrom == "b") {
value = b;
} ...
或者
switch (TakeFrom[0]) {
case 'a':
value = a;
break;
case 'b':
value = b;
break;
}
或者你可以使用查找表
int a = 1, b = 2, c = 3;
struct Lookup {
int& m_variable;
const char* m_name;
};
static const size_t NumLookups = 3;
Lookup lookups[NumLookups] = { { a, "a" }, { b, "b" }, { c, "c" } };
for (size_t i = 0; i < NumLookups; ++i) {
if (TakeFrom == lookups[i].m_name)
value = lookups[i].m_variable;
}
有了单独的变量,就没有简单的方法(除了一系列if
语句或等效语句)。
如果你把这三个变量变成一个单一的std::map<std::string,int>
,事情会容易得多。
如果a
, b
, 并且c
必须保持本地int
s,那么您唯一的方法就是无聊的方法,即像这样:
int val;
if (TakeFrom == "a") {
val = a;
} else if (TakeFrom == "b") {
val = b;
} else if (TakeFrom == "c") {
val = c;
} else {
// It's an error
}
如果你愿意接受一些改变,你可以做几件事:
TakeFrom
,使其成为整数而不是字符串(例如,0
表示a
、1
表示b
和2
表示c
),则可以将a
、b
和c
放入数组中,并将整数TakeFrom
用作索引。switch
.