C++中循环的模板
有没有办法让同一个模板可以处理n个变量嵌套循环 例如:C++中循环的模板,c++,templates,C++,Templates,有没有办法让同一个模板可以处理n个变量嵌套循环 例如: for (auto & node : mnodes) { for (auto & parent : node->parents) { \\ do something } } 外循环和内循环的参数总是不同的,内循环的数量也不同。我认为模板方法太复杂了。我将在分离的函数中移动变量逻辑 void do_something_parents(const Node &node) {
for (auto & node : mnodes) {
for (auto & parent : node->parents) {
\\ do something
}
}
外循环和内循环的参数总是不同的,内循环的数量也不同。我认为模板方法太复杂了。我将在分离的函数中移动变量逻辑
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);
}
你可以选择一组可变的函数,循环所有函数,最后一个除外
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)...);
}
}
请说得更具体些。您希望在编译时选择哪些参数运行时选择哪些参数?它总是父母、孩子和价值观还是不同的成员?顺便说一句,有办法吗?总是肯定的。你试过什么吗?你能展示一些代码来说明这个模板应该是什么样子或者你想如何使用它吗?你想递归地下降一个嵌套的模板或者一个指针树吗。两件不同的事?例如,std::vectorC++20的协同程序或范围可能在这方面有所帮助。链接转换或选择器函数。我刚才问了一个类似的问题。答案很有启发性@HazemAbaza您能否提供您希望迭代的类的完整实现。例如,子节点也是节点吗?孩子们也有自己的孩子,他们也有自己的孩子。您需要向我们展示定义和类型。如果子节点也是有自己子节点的节点,那么这将不起作用,以此类推。然而OP并没有提供足够的信息。
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 */ });