模板参数中的循环依赖关系

ify*_*ner 4 c++ templates

有人建议在这里使用的元组,而不是所有的公共建筑.我发现它很有用.但我现在的问题是以下部分:

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>;
Run Code Online (Sandbox Code Playgroud)

如何克服模板参数中的循环依赖性.由于在不知道类型节点的情况下无法形成类型Edge,因此前向声明(拥有我所拥有的知识)将无法工作,反之亦然.

显然,我可以制作其中之一struct并完成它.但是,在访问中打破对称性将是丑陋的.

Vit*_*meo 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;
}; 
Run Code Online (Sandbox Code Playgroud)