Ich versuche, eine generische Diagrammstruktur zu erstellen, aber ich stoße auf diese kreisförmige Abhängigkeit zwischen Scheitelpunkten und Kanten. Ich definiere meine Vertex- und Edge-Klassen folgendermaßen:
template<typename EdgeType>
struct Vertex {
std::vector<EdgeType> successors;
};
template<typename EdgeCostType, typename VertexWrapper>
struct Edge {
EdgeCostType cost;
VertexWrapper source;
VertexWrapper dest;
};
Ich würde es gerne mit so etwas instanziieren Vertex<Edge<int, std::shared_ptr<decltype(v)>>> v;
, aber ich kann es offensichtlich nicht. Was kann ich tun, um diese zirkuläre Abhängigkeit aufzulösen?
Bearbeiten:
Ich denke, dieses Problem besteht darin, die aktuelle Vorlage als Vorlagenparameter für einen der Vorlagenparameter der aktuellen Vorlage zu verwenden, z. B. wie man so etwas macht:
template<typename VertexWrapper>
struct Vertex {
std::vector<pair<int, VertexWrapper<Vertex>>> successors;
};
c++
c++11
c++17
circular-dependency
Simon Berens
quelle
quelle
template <typename> class VertexWrapper
? Warum haben Sie sowohl C ++ 11- als auch C ++ 17-Tags? Auf welchen Standard zielen Sie ab?template <typename> typename VertexWrapper
VertexWrapper
Typargument immer die Form habenstd::shared_ptr<decltype(v)>
odersome_template_here<decltype(v)>
?Antworten:
Mit dem Vorlagenvorlagenparameter können Sie Folgendes tun:
quelle
deins funktioniert einfach .. (aber ich weiß nicht, wie man einen Mitgliedsvektor druckt und initialisiert)
quelle
Vertex<Edge<double, Vertex</*..*/>>>
...Die Antwort von Jarod42 wird funktionieren, aber Sie müssen nur verdoppeln. Wenn Sie eine flexiblere Version wünschen, die beispielsweise
int
s akzeptiert , haben Sie auch folgende Option:Auf diese Weise können Sie andere Arten von Zahlen verwenden, wenn Sie aus irgendeinem Grund eine Abkürzung dafür benötigen. Dann würde die Verwendung von Doppel wie folgt aussehen:
quelle
template <typename T> struct graph_type { using egde = Edge<T, Vertex>; using vertex = Vertex<edge>; };