Estoy tratando de hacer una estructura gráfica genérica, pero me encuentro con esta dependencia circular entre vértices y bordes. Defino mis clases Vertex y Edge así:
template<typename EdgeType>
struct Vertex {
std::vector<EdgeType> successors;
};
template<typename EdgeCostType, typename VertexWrapper>
struct Edge {
EdgeCostType cost;
VertexWrapper source;
VertexWrapper dest;
};
Me gustaría crear una instancia con algo así Vertex<Edge<int, std::shared_ptr<decltype(v)>>> v;
, pero obviamente no puedo. ¿Qué puedo hacer para resolver esta dependencia circular?
Editar:
Creo que este problema se reduce a usar la plantilla actual como parámetro de plantilla para uno de los parámetros de plantilla de la plantilla actual, por ejemplo, cómo hacer algo como esto:
template<typename VertexWrapper>
struct Vertex {
std::vector<pair<int, VertexWrapper<Vertex>>> successors;
};
c++
c++11
c++17
circular-dependency
Simon Berens
fuente
fuente
template <typename> class VertexWrapper
? Además, ¿por qué tiene las etiquetas C ++ 11 y C ++ 17? ¿Qué estándar estás apuntando?template <typename> typename VertexWrapper
VertexWrapper
supone que el argumento tipo siempre tiene la formastd::shared_ptr<decltype(v)>
osome_template_here<decltype(v)>
?Respuestas:
Con el parámetro de plantilla de plantilla, puede hacer algo como:
fuente
el suyo simplemente funciona ... (pero no sé cómo imprimir e inicializar el vector miembro)
fuente
Vertex<Edge<double, Vertex</*..*/>>>
...La respuesta de Jarod42 funcionará, pero te limita a solo duplicar. Si desea una más flexible que acepte
int
s, por ejemplo, también tiene esta opción:Esto le permitirá usar otros tipos de números, si por alguna razón necesita una abreviatura para eso. Luego, usar dobles se vería así:
fuente
template <typename T> struct graph_type { using egde = Edge<T, Vertex>; using vertex = Vertex<edge>; };