C ++变量类型有条件

时间:2017-07-31 16:02:30

标签: c++ c++11 types

我有两个类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 ++中做到这一点?

干杯

1 个答案:

答案 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,因为它是用户输入,仅在运行时已知,其中类型仅在编译时定义。

相关问题