有人建议here使用元组而不是所有公共结构。我发现它很有用。但我现在的问题是以下部分:
using Edge = std::tuple<Node_wp,//From Node
Node_wp>;//To Node
using Edge_wp = std::weak_ptr<Edge>;
using Node = std::tuple<std::vector<Edge_wp>,//Incoming Edges
std::vector<Edge_wp>>;//Outgoing Edges
using Node_wp = std::weak_ptr<Node>;
如何克服模板参数中的循环依赖性。由于在不知道类型Node的情况下无法形成类型Edge,因此前向声明(拥有我所拥有的知识)将无效。
显然我可以制作其中一个struct
并完成它。但是,在访问中打破对称性将是丑陋的。
答案 0 :(得分:5)
您可以使用struct
和公共继承来修复循环依赖问题。 Node
将成为struct
std::tuple
包装器
#include <memory>
#include <tuple>
#include <vector>
struct Node;
using Node_wp = std::weak_ptr<Node>;
using Edge = std::tuple<Node_wp, // From Node
Node_wp>; // To Node
using Edge_wp = std::weak_ptr<Edge>;
struct Node : std::tuple<std::vector<Edge_wp>, // Incoming Edges
std::vector<Edge_wp>> // Outgoing Edges
{
using std::tuple<std::vector<Edge_wp>, std::vector<Edge_wp>>::tuple;
};