int a = 1;
int b = 2;
int c = 3;
std::string TakeFrom = "a";
Как я могу получить значение из TakeFrom, в данном случае, a, и прочитать целое число, названное так? Например, в приведенном выше коде мне нужно будет прочитать значение a, потому что TakeFrom содержит «a», поэтому я получу «1», но если TakeFrom содержит «b», я получу значение b (2).
Если 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
,В нормальных условиях 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>
все будет намного проще.