web-dev-qa-db-ja.com

現在のテンプレートをテンプレートパラメータの1つに対するテンプレートパラメータとして使用する

一般的なグラフ構造を作成しようとしていますが、頂点とエッジの間の循環依存関係に遭遇しています。私はVertexクラスとEdgeクラスを次のように定義します。

_template<typename EdgeType>
struct Vertex {
    std::vector<EdgeType> successors;
};

template<typename EdgeCostType, typename VertexWrapper>
struct Edge {
    EdgeCostType cost;
    VertexWrapper source;
    VertexWrapper dest;
};
_

Vertex<Edge<int, std::shared_ptr<decltype(v)>>> v;のようなものでインスタンス化したいのですが、明らかにできません。この循環依存関係を解決するにはどうすればよいですか?

編集:

この問題の要約は、現在のテンプレートを現在のテンプレートのテンプレートパラメータの1つに対するテンプレートパラメータとして使用することです。このようなことをする方法:

_template<typename VertexWrapper>
struct Vertex {
    std::vector<pair<int, VertexWrapper<Vertex>>> successors;
};
_
8
Simon Berens

テンプレートテンプレートパラメータを使用すると、次のようなことができます。

template<typename EdgeType>
struct Vertex {
    std::vector<EdgeType> successors;
};

template<typename EdgeCostType, template <typename> class VertexWrapper>
struct Edge {
    EdgeCostType cost;
    VertexWrapper<Edge> source;
    VertexWrapper<Edge> dest;
};


using myEdge = Edge<double, Vertex>;
using myVertex = Vertex<myEdge>;
10
Jarod42

yoursは単純に機能します。(ただし、メンバーベクトルを印刷して初期化する方法がわかりません)

#include <vector>
#include <iostream>  
using namespace std;

template<typename EdgeType>
struct Vertex {
    vector<EdgeType> successors;
};

template<typename EdgeCostType, typename VertexWrapper>
struct Edge {
    EdgeCostType cost;
    VertexWrapper source;
    VertexWrapper dest;
};

int main (){

    Vertex<int> vertx = {{5}};
    Edge<int, decltype(vertx)> ed = {7};

    cout<< ed.cost <<"\n";     //cout<< ed.dest.successors<<"\n";   // not work, ask help!
}
2
nonock

Jarod42の答え は機能しますが、2倍のみに制限されます。たとえば、intsを受け入れるより柔軟なものが必要な場合は、次のオプションもあります。

template<class T>
using myEdge = Edge<T, Vertex>;

template<class T>
using myVertex = Vertex<myEdge<T>>;

これにより、何らかの理由で省略形が必要な場合に、他のタイプの数値を使用できます。次に、doubleを使用すると、次のようになります。

myVertex<double> v;
0
Chipster