模板类相互依赖
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;
...
}
相关文章:
- 如何从C++中的依赖类型中获得它所依赖的类型
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 将依赖名称显式标记为类型名和模板的奇怪之处
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- C++GTKMM gui循环依赖关系
- 通过ccmake在cmake中缓存依赖选项
- 当基类是依赖类型时,这是一个缺陷吗
- 从不同的附加依赖项中识别等同命名的函数
- 如何在 CMake 中对目标依赖项进行分组?
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 为什么构建目录中新构建的共享库与安装目录中的副本具有不同的依赖项集?
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 为什么内存屏障依赖于变量?
- node-gyp 的先有鸡还是先有蛋的问题:指向依赖项中的头文件
- 反转依赖于 end() 的迭代器
- GCC,CMake,预编译标头和维护依赖项
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 为什么依赖模板类型在部分专用化中不可推导?