一般的なグラフ構造を作成しようとしていますが、頂点とエッジの間の循環依存関係に遭遇しています。私は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;
};
_
テンプレートテンプレートパラメータを使用すると、次のようなことができます。
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>;
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!
}
Jarod42の答え は機能しますが、2倍のみに制限されます。たとえば、int
sを受け入れるより柔軟なものが必要な場合は、次のオプションもあります。
template<class T>
using myEdge = Edge<T, Vertex>;
template<class T>
using myVertex = Vertex<myEdge<T>>;
これにより、何らかの理由で省略形が必要な場合に、他のタイプの数値を使用できます。次に、doubleを使用すると、次のようになります。
myVertex<double> v;