Вы можете взять пакет 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 */ });