int a = 1;
int b = 2;
int c = 3;
std::string TakeFrom = "a";
如何从TakeFrom获取值,在本例中为a,并读取这样的整数?例如,在上面的代码中,我必须读取一个值,因为'a'是TakeFrom包含的,所以我得到“1”,但如果TakeFrom包含“b”,我会得到b的值(2)。
答案 0 :(得分:1)
在正常的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;
}
答案 1 :(得分:0)
有了单独的变量,没有简单的方法(除了一系列if
语句或等价的)。
如果您将三个变量转换为单个std::map<std::string,int>
,那么事情就会容易得多。
答案 2 :(得分:0)
如果a
,b
和c
必须保留在本地int
,那么您执行此操作的唯一方法就是无聊,例如:
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
表示{{1} }},b
表示2
),您可以将c
,a
和b
放入数组中,并使用整数{{1}作为索引。c
替换条件序列。