首页 > 解决方案 > 将当前模板用作模板参数之一的模板参数

问题描述

我正在尝试制作一个通用的图结构,但我遇到了顶点和边之间的这种循环依赖。我像这样定义我的 Vertex 和 Edge 类:

template<typename EdgeType>
struct Vertex {
    std::vector<EdgeType> successors;
};

template<typename EdgeCostType, typename VertexWrapper>
struct Edge {
    EdgeCostType cost;
    VertexWrapper source;
    VertexWrapper dest;
};

我想用类似的东西来实例化它Vertex<Edge<int, std::shared_ptr<decltype(v)>>> v;,但我显然不能。我能做些什么来解决这种循环依赖?

编辑:

我认为这个问题归结为使用当前模板作为当前模板的模板参数之一的模板参数,例如如何做这样的事情:

template<typename VertexWrapper>
struct Vertex {
    std::vector<pair<int, VertexWrapper<Vertex>>> successors;
};

标签: c++c++11c++17circular-dependency

解决方案


使用模板模板参数,您可以执行以下操作:

template<typename EdgeType>
struct Vertex {
    std::vector<EdgeType> successors;
};

template<typename EdgeCostType, template <typename> class VertexWrapper>
struct Edge {
    EdgeCostType cost;
    VertexWrapper<Edge> source;
    VertexWrapper<Edge> dest;
};


using myEdge = Edge<double, Vertex>;
using myVertex = Vertex<myEdge>;

推荐阅读