我有两个类 TreeNodeRange(Tree & t)
和 VertexNodeRange(Vertex & v)
。遍历第一个等于遍历树中的所有节点,而遍历第二个等于遍历给定顶点 v 的子节点的所有节点。
现在根据用户输入,我想遍历整棵树或只遍历从 v 开始的子树。
我试过这样的:
const bool only_subtree = to_bool(argv[1]);
typedef std::conditional<only_subtree, VertexNodeRange,TreeNodeRange>::type NodeRange;
现在的问题是我不知道如何定义 NodeRange 类型的对象。我试过:
Vertex v = tree.get_vertex_by_id(17);
NodeRange get_range = [&](const bool only_subtree, Vertex & v)
{
if(only_subtree) return NodeRange(v);
return NodeRange(tree);
};
for(auto node : get_range(only_subtree, v)){
...
}
编译器似乎不喜欢这样,因为构造函数 NodeRange 必须可以用 Vertex 或 Tree 调用,当然它不能。
有没有办法在 C++ 中做到这一点?
干杯
最佳答案
你可以做一个模板函数:
template<typename AnyNodeRange>
void processChildNodes(AnyNodeRange& anyNodeRange)
{
for(auto node : anyNodeRange){
...
}
}
并像这样使用它:
Vertex v = tree.get_vertex_by_id(17);
if (only_subtree) {
VertexNodeRange vertexNodeRange(v);
processChildNodes(vertexNodeRange);
}
else
{
TreeNodeRange treeNodeRange(tree);
processChildNodes(treeNodeRange);
}
您不能使用 only_subtree 创建 typedef,因为它是用户输入,仅在运行时才知道,而类型仅在编译时定义。
关于C++ 变量类型条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45420532/