0
int a = 1;
int b = 2;
int c = 3;
std::string TakeFrom = "a";

如何从 TakeFrom 中获取值,在本例中为 a,并读取这样命名的整数?例如,在上面的代码中,我必须读取 a 的值,因为“a”是 TakeFrom 包含的内容,所以我会得到“1”,但如果 TakeFrom 包含“b”,我会得到 b 的值 (2)。

4

3 回答 3

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;
}
于 2013-11-01T20:48:09.720 回答
0

有了单独的变量,就没有简单的方法(除了一系列if语句或等效语句)。

如果你把这三个变量变成一个单一的std::map<std::string,int>,事情会容易得多。

于 2013-11-01T20:42:03.570 回答
0

如果a, b, 并且c必须保持本地ints,那么您唯一的方法就是无聊的方法,即像这样:

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表示a1表示b2表示c),则可以将abc放入数组中,并将整数TakeFrom用作索引。
  • 如果您愿意只允许单字符变量,则可以将条件序列替换为单个switch.
  • 如果您愿意使用标准集合,请将单个变量替换为字符串到整数的映射。
于 2013-11-01T20:50:13.010 回答