2017-07-31 116 views
0

我有兩個類TreeNodeRange(Tree & t)VertexNodeRange(Vertex & v)。循環遍歷第一個循環等於遍歷樹中的所有節點,而循環遍歷第二個循環遍歷子節點到給定頂點的所有節點循環現在,根據用戶輸入,我希望循環。在C++變量類型條件

始於訴整棵樹或僅子樹我想是這樣的:

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必須調用與任一頂點或樹這當然沒有。

有沒有辦法在C++中做到這一點?

乾杯

+0

聽起來像多態的工作。 – HolyBlackCat

+0

我應該說,這些類是在我沒有直接訪問的外部庫中定義的。 – Lxndr

+0

然後爲它們製作多態包裝? – HolyBlackCat

回答

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); 
} 

使用的typedef only_subtree你可以不化妝,因爲這是用戶輸入,只在運行時已知,其中類型僅在編譯時定義。

+0

完美,謝謝! – Lxndr