Много переменных, лучший подход без вложенных циклов

Мне нужна помощь и руководство по дизайну моего кода. Я хочу запускать тесты с несколькими переменными, установленными на несколько значений, без создания безумного количества вложенных циклов. У меня есть структура, которая содержит различные переменные, подобные этой (только три целых числа в качестве примера, но реальная сделка будет содержать намного больше, включая логические значения, двойные числа и т. д.):

struct VarHolder
{
    int a;
    int b;
    int c;
    // etc..
    // etc..
};

Структура передается в тестовую функцию.

bool TestFunction(const VarHolder& _varholder)
{
    // ...
}

Я хочу запустить тест для всех переменных в диапазоне их заданного диапазона, всех комбинаций переменных. Один из способов — создать цикл для каждой переменной:

for (int a = 0; a < 100; a++)
{
  for (int b = 10; b < 90; b++)
    {
      for (int c = 5; c < 65; c++)
        {
          //...
          //...

             //set variables
             VarHolder my_varholder(a, b, c /*, ...*/);
             TestFunction(my_varholder);
        }
    }
}

Но это кажется неэффективным и быстро становится нечитаемым по мере увеличения количества переменных. Каков элегантный способ добиться этого? Одна из проблем заключается в том, что переменные будут меняться в будущем, удаляя некоторые, добавляя новые и т. д., поэтому предпочтительнее какое-то решение без перезаписи циклов для каждой переменной по мере их изменения.

Зачем помечать как java/c#/c++? Для С# -> Вы должны проверить отражение

Jeroen van Langen 22.05.2019 11:35

Элегантный способ состоит в том, чтобы реорганизовать вашу массивную структуру на более мелкие части логических единиц вместо того, чтобы иметь один массивный класс/структуру с некоторыми трудными для понимания зависимостями между их членами.

MakePeaceGreatAgain 22.05.2019 11:40

Вы можете создавать диапазоны, а затем использовать (или создавать (если это недоступно на вашем языке/библиотеках)) декартово произведение (представление) или эти диапазоны.

Jarod42 22.05.2019 11:42

уже само название Varholder говорит о том, что вы не очень хорошо продумали свой дизайн. Если это собрание огромного количества членов, и вы не можете назвать его получше, то это ваша реальная проблема.

463035818_is_not_a_number 22.05.2019 11:59

@JeroenvanLangen Я отметил несколько языков, потому что вопрос применим не только к одному конкретному языку. С другой стороны, я не знал, что существуют функции, зависящие от языка, поэтому я изменил теги только на c++. Спасибо.

JesseB1234 22.05.2019 12:44

@formerlyknownas_463035818 Именование функций, классов или структур здесь не при чем, это всего лишь несколько примеров, объясняющих проблему.

JesseB1234 22.05.2019 12:45

@ Jarod42 Декартово произведение выглядит многообещающе.

JesseB1234 22.05.2019 12:54

Вы должны пометить только язык, который вы на самом деле используете, чтобы соответствующие ответы могли быть даны без отвлечения внимания. C++, C# и Java — это полностью, полностью, полностью отдельные и независимые языки, между которыми практически нет связи.

Lightness Races in Orbit 22.05.2019 13:59
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
8
169
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С диапазон-v3 вы можете использовать представление cartesian_product:

auto as = ranges::view::ints(0, 100);
auto bs = ranges::view::ints(10, 90);
auto cs = ranges::view::ints(5, 65);
// ...
// might be other thing that `int`

for (const auto& t : ranges::view::cartesian_product(as, bs, cs /*, ...*/))
{
    std::apply(
        [](const auto&... args) {
            VarHolder my_varHolder{args...};
            Test(my_varHolder);
        },
        t);
}

Это именно то, что я искал. Библиотека De также содержит некоторые другие интересные функции.

JesseB1234 22.05.2019 15:55

Другие вопросы по теме