有人建议 here 使用元组而不是所有公共(public)结构。我发现它很有用。但我的问题现在出现在以下部分:

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 并完成它。但是在访问中打破对称性将是丑陋的。

最佳答案

您可以使用 struct 和公共(public)继承来解决循环依赖问题。 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;
};

关于c++ - 模板参数中的循环依赖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46767470/

10-08 21:02