Получить значение из целого числа, имя которого находится в строке

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

Как я могу получить значение из TakeFrom, в данном случае, a, и прочитать целое число, названное так? Например, в приведенном выше коде мне нужно будет прочитать значение a, потому что TakeFrom содержит «a», поэтому я получу «1», но если TakeFrom содержит «b», я получу значение b (2).

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 средства a, 1 средства b, а также 2 средства c), вы могли бы разместить a, b, а также c в массив, и использовать целое число TakeFrom в качестве индекса.
  • Если вы хотите разрешить только односимвольные переменные, вы можете заменить последовательность условий на одну switch,
  • Если вы открыты для использования стандартных коллекций, замените отдельные переменные отображением строки в целое число.
0

Другие решения

В нормальных условиях 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

С отдельными переменными нет простого пути (кроме ряда if заявления или эквивалент).

Если вы превратили три переменные в один std::map<std::string,int>все будет намного проще.

0
По вопросам рекламы [email protected]