Estou tentando criar uma estrutura de gráfico genérica, mas estou enfrentando essa dependência circular entre vértices e arestas. Eu defino minhas classes Vertex e Edge da seguinte forma:
template<typename EdgeType>
struct Vertex {
std::vector<EdgeType> successors;
};
template<typename EdgeCostType, typename VertexWrapper>
struct Edge {
EdgeCostType cost;
VertexWrapper source;
VertexWrapper dest;
};
Eu gostaria de instanciar isso com algo do tipo Vertex<Edge<int, std::shared_ptr<decltype(v)>>> v;
, mas obviamente não posso. O que posso fazer para resolver essa dependência circular?
Editar:
Eu acho que esse problema se resume em usar o modelo atual como um parâmetro de modelo para um dos parâmetros do modelo atual, por exemplo, como fazer algo assim:
template<typename VertexWrapper>
struct Vertex {
std::vector<pair<int, VertexWrapper<Vertex>>> successors;
};
c++
c++11
c++17
circular-dependency
Simon Berens
fonte
fonte
template <typename> class VertexWrapper
? Além disso, por que você tem as tags C ++ 11 e C ++ 17? Qual padrão você está alvejando?template <typename> typename VertexWrapper
VertexWrapper
argumento de tipo sempre deve ter a formastd::shared_ptr<decltype(v)>
ousome_template_here<decltype(v)>
?Respostas:
Com o parâmetro template template, você pode fazer algo como:
fonte
o seu simplesmente funciona .. (mas eu não sei como imprimir e inicializar o vetor de membro)
fonte
Vertex<Edge<double, Vertex</*..*/>>>
...A resposta de Jarod42 funcionará, mas a limita a dobrar. Se você quer um mais flexível que aceite
int
s, por exemplo, também tem esta opção:Isso permitirá que você use outros tipos de números, se por algum motivo precisar de uma abreviação para isso. Em seguida, o uso de duplas ficaria assim:
fonte
template <typename T> struct graph_type { using egde = Edge<T, Vertex>; using vertex = Vertex<edge>; };