所以我使用了以下类型的增强图:
typedef boost::adjacency_list<boost::listS, boost::vecS, boost:directedS, VertexT, EdgeT> GraphT
VertexT和EdgeT都是保留我需要的许多属性的类。这些是捆绑属性。我不确定我是否有可能使用bgl的某些方式,所以如果你熟悉它们,我们将非常感谢帮助。
VertexT和EdgeT被认为是多态基类。我的理解是bgl不是用于指向这些属性的指针。如何使用BGL处理多态顶点和边缘属性?我想过使用共享指针,但我更喜欢自己管理内存。此外,这似乎可以防止在使用boost :: get生成boost布局的位置图时出现问题。
现在我通过让顶点包含指向真正多态类的另一个指针来破解我的方式。但这似乎太复杂了。有什么建议吗?
答案 0 :(得分:8)
在算法的通用实现中,最好使用值语义:复制对象会导致存在两个相同的对象,这些对象是独立的。当需要复制对象时,这是至关重要的属性。动态多态不能立即使用值语义,因为对于动态多态的使用,您需要处理指针或引用:使用值时,静态类型和动态类型的对象重合,不允许直接动态多态。 / p>
在这种情况下处理动态多态对象的唯一方法是为它们提供值外观。实际上,这意味着您需要将对象的指针封装到对象中,从而暴露所需的值接口(如果您坚持,也可以封装引用,但我从未发现这种方法很有效)。 Boost Graph库并不真正关心各种结构如何在内部表示,只要它们具有所需的接口并实现所需的语义即可。从你所描述的使用包装器指向多态对象的指针是正确的方法。无论您是通过标准智能指针之一维护对象还是以不同方式维护对象并不重要,尽管我认为使用boost::shared_ptr<T>
或std::shared_ptr<T>
之类的东西会消除许多不必要的复杂情况。
所有这些都说,我想指出我很少找到动态多态对象与算法结合的有用示例!是的,有一些,但大多数时候使用动态多态性导致问题,而不是解决方案(尽管许多人只接触过面向对象技术;但是,如果你知道的唯一工具是锤子,每个问题看起来都像一个钉子。)
答案 1 :(得分:1)
我认为你基本上解决了与这个问题相同的问题:
仅适用于(捆绑)属性。我建议你可以通过调用独立的函数模板来实现多态性。
对于真正的大功率机械:
另见本文:On the Tension Between Object-Oriented and Generic Programming in C++;该论文描述了类型擦除,它是解决/桥接运行时/静态多态性需求的最终解决方案。 (_注意,如果你需要实现类型擦除,Boost Variant,Boost Any等库会更方便。)