c++ - TemplateClasses 相互依赖

标签 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
  • Edge 可以通过指针从网络访问 NodesList

所有 NodeType 都派生自 GenericNodeClass,所有 EdgeType 派生自 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;
    ...
}

更好的是,利用对称性将 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;
    ...
}

关于c++ - TemplateClasses 相互依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20515797/

相关文章:

c++ - 一个for循环的测试条件可以放多个关系表达式吗?

c++ - 学习用 C++ 创建动画

c++ - 正确的名字足以让它发生吗?

c++ - 派生类的模板参数推导

javascript - 如何从全局范围访问 Angular 应用程序的 $templateCache?

c++ - 仅在根节点上运行回调

c++ - linux pthread - 有没有办法不将所有成员创建为静态成员?

c++ - 无法从 int 推断出 'const' ... 的模板参数

C++ 模板蒯因

c++ - GCC模板问题