2012-01-17 36 views
2

所以我使用的是以下類型的提升圖:Boost圖庫多態性捆綁屬性

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

VertexT和EdgeT都是類,來保持很多我需要的屬性。這些是捆綁的屬性。我不確定如果我想使用bgl的某些方式是可能的,所以如果您熟悉它們,將會非常感激。

VertexT和EdgeT被假設爲多態基類。我的理解是bgl不是用來指向這些屬性的。如何用BGL處理多態頂點和邊的屬性?我想過使用共享指針,但我更願意自己管理內存。此外,這似乎可以防止在使用boost :: get生成boost佈局的位置圖時出現問題。

現在我已經通過讓頂點包含另一個指向真正的多態類的指針來解決這個問題。但那似乎太複雜了。有什麼建議麼?

回答

7

在算法的泛型實現中,最好使用值語義:複製對象會導致存在兩個相互獨立的相同對象。當需要複製對象時,這是至關重要的屬性。動態多態不會立即與值語義協同工作,因爲使用動態多態時需要處理指針或引用:使用值時,靜態類型和動態類型的對象一致,它不允許直接動態多態。

在這種情況下處理動態多態對象的唯一方法是給它們一個值的外觀和感覺。實際上,這意味着您需要將指向您的對象的指針封裝到公開所需值接口的對象中(如果您堅持,也可以封裝引用,但我從來沒有發現它可以很好地工作)。 Boost Graph庫並不關心各種結構如何在內部表示,只要它們具有所需的接口並實現所需的語義。從你用一個包裝器描述你的指針到多態對象是正確的路要走。無論你是通過標準智能指針還是不同的方式來維護對象,雖然我猜測使用諸如boost::shared_ptr<T>std::shared_ptr<T>之類的東西可以消除一些不必要的複雜情況。所有這一切,我想指出,我很少發現動態多態對象與算法結合的有用示例!是的,有一些但大部分時間使用動態多態是造成問題的原因,而不是解決方案(儘管許多人只接觸面嚮對象的技術;但是,如果你知道的唯一工具是錘子,每個問題看起來像一個釘子)。

0

我想你基本上解決了同樣的問題,因爲這問題:

僅供(捆綁)的屬性。我建議你可以通過調用獨立函數模板來完成多態。


對於真正的高功率設備:

參見本文:On the Tension Between Object-Oriented and Generic Programming in C++;該論文描述了類型擦除,這種類型的擦除是解決/橋接運行時/靜態多態需求的最終解決方案。 (_注意,如果需要實現類型擦除,諸如Boost Variant,Boost Any等庫更方便)。