Шаблон для циклов в C ++ - PullRequest
       0

Шаблон для циклов в C ++

0 голосов
/ 26 февраля 2020

Есть ли способ иметь тот же шаблон, который может обрабатывать n (переменные) циклов?

, например:

for (auto & node : mnodes) {
    for (auto & parent : node->parents) {
        \\ do something
   }
}
for (auto & tree : mtrees) {
    for (auto & branch : tree->mbranches) {
         for(auto & root : branch ->roots  ) {
             \\ do something
       }
   }
}

Параметры внешнего и внутренние циклы всегда различны, и число внутренних циклов также различно.

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Вы можете взять пакет c функций (-подобных) с вариациями и l oop для всех, кроме последнего.

template <typename T, typename Last>
void nested_foreach(T&& t, Last&& last) {
     std::forward<Last>(last)(std::forward<T>(t));
}

template <typename T, typename First, typename Second, typename... Rest>
void nested_foreach(T & t, First&& first, Second&& second, Rest&& rest) {
    for (auto&& u : std::forward<First>(first)(std::forward<T>(t))) {
        nested_foreach(std::forward<decltype(u)>(u), std::forward<Second>(second), std::forward<Rest>(rest)...);
    }
}

Который вы бы использовали как:

nested_foreach(mnodes, std::mem_fn(&Node::parents), [](auto &){ /* do something */ });

nested_foreach(mtrees, std::mem_fn(&Tree::mbranches), std::mem_fn(&Branch::roots), [](auto &){ /* do something */ });
0 голосов
/ 26 февраля 2020

Я думаю, что шаблонный подход слишком сложен. Я бы переместил переменную logi c в разделенные функции

void do_something_parents(const Node &node) {
    for (auto & parent : node->parents) {
        \\ do sthg
   }
}

void do_something_children(const Node &node) {
    for (auto & child : node->children) {
        for(auto & value : node ->values  ) {
         \\ do sthg
        }
    }
}

Затем вы можете использовать их как

for (auto & node : mnodes) {
    do_something_parents(node);
    do_something_children(node);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...