模板类相互依赖

TemplateClasses depending on each other

本文关键字:依赖      更新时间:2023-10-16
template <class NodeType, class EdgeType>
class GenericNetworkClass {
    typedef std::vector<EdgeType<NodeType>*> EdgesType;
    typedef std::vector<NodeType<EdgeType>*> NodesType;
    EdgesType EdgesList;
    NodesType NodesList;
}
template <class NodeType>
class GenericEdgeClass {
    std::vector<NodeType*> *Nodes;
    GenericNodeClass(std::vector<NodeType<GenericEdgeClass>*> *NodesPtr);
}
template <class EdgeType>
class GenericNodeClass {
    std::vector<EdgeType*> *Edges;
    GenericNodeClass(std::vector<EdgeType<GenericNodeClass>*> *EdgesPtr);
}

简单来说,我只想要一个带有模板节点和模板边缘的NetworkClass,其中

  • 节点可以通过指针从网络访问EdgeList
  • Edge 通过指针从网络访问NodesList

所有节点类型都派生自GenericNodeClass,所有边类型派生自GenericEdgeClass

显然我写的东西不起作用。这里正确的方法是什么?
我希望清楚我想做什么。

谢谢!

你可以用前向声明来处理循环依赖关系,但你的模板很奇怪:当你可以使边和节点的用户定义类不受约束的"有效负载"时,为什么要强制执行类层次结构,遇到所有类型的协方差麻烦?

template <typename EdgeData, typename NodeData> class Edge;    
template <typename EdgeData, typename NodeData> class Node;
template <typename EdgeData, typename NodeData> class Edge{
    std::vector<Node<EdgeData, NodeData>*> *Nodes;
    EdgeData data;
    public:
    Edge(std::vector<Node<EdgeData, NodeData>*>  *NodesPtr, EdgeData & data);
    EdgeData getData();
    void addNode(Node<EdgeData, NodeData> & node);
    ...
}
template <typename EdgeData, typename NodeData> class Node{
    std::vector<Edge<EdgeData, NodeData>*> *Edges;
    NodeData data;
    public:
    Node(std::vector<Edge<EdgeData, NodeData>*>  *EdgesPtr, NodeData & data);
    NodeData getData();
    void addEdge(Edge<EdgeData, NodeData> & edge);
    ...
}
template <typename EdgeData, typename NodeData> class Hypergraph{
    private:
    std::vector<Edge<EdgeData, NodeData>*> edgesList;
    std::vector<Node<EdgeData, NodeData>*>  nodesList;
    ...
}

更好的是,利用对称性将边缘和节点减少到单个类:

template <typename OwnData, typename DualData> class Entity{
    std::vector<Entity<DualData, OwnData>*> *duals;
    OwnData data;
    public:
    Entity(std::vector<Entity<DualData, OwnData>*>  *duals, OwnData & data);
    OwnData getData();
    void addDual(Entity<DualData, OwnData> & dual);
    ...
}
template <typename EdgeData, typename NodeData> class Hypergraph{
    private:
    std::vector<Entity<EdgeData, NodeData>*> edgesList;
    std::vector<Entity<NodeData, EdgeData>*>  nodesList;
    ...
}