Множество переменных, лучший подход без вложенных циклов - PullRequest
0 голосов
/ 22 мая 2019

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

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);
        }
    }
}

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

1 Ответ

6 голосов
/ 22 мая 2019

С range-v3 вы можете использовать cartesian_product view:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...