TemplateClasses相互依赖

时间:2013-12-11 09:49:17

标签: c++ templates

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
  • 边缘通过指针
  • 从网络进入NodesList

所有NodeType都派生自GenericNodeClass,所有EdgeType都派生自GenericEdgeClass

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

谢谢!

1 个答案:

答案 0 :(得分:1)

你可以使用前向声明来处理循环依赖,但是你的模板很奇怪:为什么你应该强制执行类层次结构,遇到所有类型的协方差问题,当你可以为边缘和节点设置用户定义的类时不受约束“有效载荷“?

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;
    ...
}

更好的是,利用对称性将Edge和Node简化为单个类:

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;
    ...
}