模板参数中的循环依赖

时间:2017-10-16 09:53:01

标签: c++ templates

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

1 个答案:

答案 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;
};