цикл по переменным без массива

114
24 декабря 2020, 15:50

Есть N переменных c названиями вида variable_1 .. variable_N.
Можно ли с помощью цикла во время выполнения сделать что-то с этими переменными?

for (int i = 1; i <= N; ++i)
{
   variable_i = i; // например присвоить значение
}
Answer 1

Во время исполнения такого понятия как "имя переменной" уже не существует. Имена переменных нужны только для человека, а после компиляции у переменных есть только адреса в памяти.

Если очень хочется динамически работать с именованными значениями, то можно использовать map:

map<string, int> var_map;
for (int i=1; i<=42; i++) {
    var_map["variable_" + std::to_string(i)] = 1000+i;
}
for (int i=1; i<=var_map.size(); i++) {
    cout << var_map["variable_" + std::to_string(i)];
    cout << endl;
}

Но такой вариант для программиста ни чем не удобнее массива, а по производительности - хуже. Поэтому я рекомендую использовать массив.

Либо можно использовать массив в связке с enum. Т.к. enum сводится к обычному int, его можно использовать для индексации по массиву. А для программиста enum - это понятные человекочитаемые имена.

Answer 2

Если переменные были обьявлены глобально, могу предложить такой вариант:

int
variable_1, 
variable_2, 
variable_3, 
variable_4, 
variable_5;
struct  Variable {
    int& operator ()(int i)
    {
        switch (i) {
        case 1: return variable_1;
        case 2: return variable_2;
        case 3: return variable_3;
        case 4: return variable_4;
        case 5: return variable_5;
        default:  throw std::range_error("...");
        }
    }
};
int main()
{  
    // ... 
    const int N = 5;    
    Variable variable_;
    for (int i = 1; i <= N; ++i)
    {
       variable_(i) = i; // например присвоить значение
    }
    //...
}
Answer 3
int
variable_1, 
variable_2, 
variable_3, 
variable_4, 
variable_5;
int
Variable[] = { &variable_1,
               &variable_2,
               &variable_3,
               &variable_4,
               &variable_5 };
int main()
{  
    // ... 
    const int N = sizeof(Variable)/sizeof(Variable[0]);    
    for (int i = 1; i <= N; ++i)
    {
       Variable[i] = i; // например присвоить значение
    }
    //...
}
READ ALSO
что происходит при выводе?

что происходит при выводе?

вывод в консоль: -858993460

117
Как реализовать печать класса List С++

Как реализовать печать класса List С++

Хочу реализовать печать всего класса List по порядкуList реализую на шаблонах, а в них я не очень силен

127
Вызвать функцию из dll

Вызвать функцию из dll

Пытаюсь вызвать message box из dll, учебное задание

126