2017-07-31 7 views
0

私は2つのクラスTreeNodeRange(Tree & t)VertexNodeRange(Vertex & v)を持っています。最初のルーピングはツリー内のすべてのノードをループするのと同じですが、2番目のループは指定された頂点の子ノードのすべてのノードをループするのと同じです。C++可変型条件式

ユーザー入力に応じてループします。

const bool only_subtree = to_bool(argv[1]); 
typedef std::conditional<only_subtree, VertexNodeRange,TreeNodeRange>::type NodeRange; 

問題は、私はタイプNodeRangeのオブジェクトを定義することができますどのように表示されていないということになりましたです。vから始まるツリー全体または唯一のサブツリー上

私はこのような何かを試してみました。私が試した:

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++でこれを行う方法はありますか?

template<typename AnyNodeRange> 
void processChildNodes(AnyNodeRange& anyNodeRange) 
{ 
    for(auto node : anyNodeRange){ 
    ... 
    } 
} 

とこのようにそれを使用します:あなたはテンプレート関数を作ることができます

乾杯

+0

多形の仕事のように聞こえます。 – HolyBlackCat

+0

これらのクラスは私が直接アクセスできない外部ライブラリで定義されていると言わざるを得ないでしょう。 – Lxndr

+0

それから多形ラッパーを作ってください。 – HolyBlackCat

答えて

2

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を作ることができない、唯一の実行時に知られています。ここでは、型はコンパイル時にのみ定義されます。

+0

パーフェクト、ありがとう! – Lxndr