我有两个类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 ++中做到这一点?
干杯
答案 0 :(得分:2)
您可以制作模板功能:
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,因为它是用户输入,仅在运行时已知,其中类型仅在编译时定义。