Pergunta

Portanto, estou usando um gráfico de impulso do seguinte tipo:

typedef boost::adjacency_list<boost::listS, boost::vecS, boost:directedS, VertexT, EdgeT> GraphT

VertexT e EdgeT são classes para manter muitas das propriedades de que preciso.Estas são propriedades agrupadas.Não tenho certeza se algumas das maneiras pelas quais desejo usar o bgl são possíveis, então se você estiver familiarizado com elas, agradeceríamos muito.

VertexT e EdgeT são supostamente classes base polimórficas.Meu entendimento é que o bgl não se destina a ser usado como ponteiros para essas propriedades.Como trabalhar com propriedades polimórficas de vértices e arestas com BGL?Pensei em usar ponteiros compartilhados, mas prefiro gerenciar a memória sozinho.Além disso, isso parece evitar um problema ao usar boost :: get para gerar o mapa de posição para layouts de boost.

No momento, estou hackeando meu caminho para contornar isso apenas fazendo com que o vertex contenha outro ponteiro para a verdadeira classe polimórfica.Mas isso parece muito complexo.Alguma sugestão?

Foi útil?

Solução

Em implementações genéricas de algoritmos, é preferível usar semântica de valor: copiar um objeto faz com que existam dois objetos idênticos que são independentes. Esta é uma propriedade crucial quando é necessário duplicar objetos. O polimorfismo dinâmico não funciona imediatamente com a semântica de valor porque para o uso do polimorfismo dinâmico você precisa lidar com ponteiros ou referência: ao usar valores, o tipo estático e o tipo dinâmico de objeto coincidem, o que não permite o polimorfismo dinâmico diretamente.

A única maneira de lidar com objetos polimórficos dinamicamente neste caso é dar a eles uma aparência de valor. Efetivamente, isso significa que você precisa encapsular os ponteiros para seus objetos em um objeto que exponha a interface de valor necessária (você também pode encapsular referências se insistir, mas nunca achei que isso funcionasse bem). A biblioteca Boost Graph realmente não se preocupa com a forma como as várias estruturas são representadas internamente, desde que tenham a interface necessária e implementem a semântica necessária. Pelo que você descreve, usar um invólucro para seus ponteiros para os objetos polimórficos é o caminho certo a seguir. Se você mantém o objeto por meio de um dos ponteiros inteligentes padrão ou de outra forma, realmente não importa, embora eu ache que usar algo como boost::shared_ptr<T> ou std::shared_ptr<T> remove uma série de complicações desnecessárias.

Dito isso, gostaria de salientar que raramente encontro exemplos úteis de objetos polimórficos dinamicamente combinados com algoritmos! Sim, existem alguns, mas na maioria das vezes o uso de polimorfismo dinâmico está contribuindo para o problema, não para a solução (apesar do que muitas pessoas que têm apenas exposição à técnica orientada a objetos dizem; no entanto, se a única ferramenta que você conhece é um martelo , todo problema parece um prego).

Outras dicas

Acho que você está basicamente resolvendo o mesmo problema desta pergunta:

apenas para propriedades (agrupadas).Eu sugiro que você pode fazer o polimorfismo invocando modelos de função independentes.


Para máquinas de alta potência real:

Veja também este artigo: Sobre a tensão entre programação orientada a objetos e programação genérica em C ++ ;esse artigo descreve o apagamento de tipo, que é uma espécie de 'solução' final para desacoplar / unir suas necessidades de polimorfismo estático / tempo de execução.(_Observe que bibliotecas como Boost Variant, Boost Any são muito mais convenientes se você precisar implementar o apagamento de tipo).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top