从名称在字符串上的整数中获取值

时间:2013-11-01 20:40:28

标签: c++ string evaluate

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

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

3 个答案:

答案 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)

如果abc必须保留在本地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表示a1表示{{1} }},b表示2),您可以将cab放入数组中,并使用整数{{1}作为索引。
  • 如果您只允许使用单字符变量,则可以使用单个c替换条件序列。
  • 如果您愿意使用标准集合,请将单个变量替换为字符串映射为整数。