首页 文章

Boost Graph Library Polymorphic Bundled Properties

提问于
浏览
2

所以我使用了以下类型的增强图:

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

VertexT和EdgeT都是保留我需要的许多属性的类 . 这些是捆绑属性 . 我不确定我是否有可能使用bgl的方式,所以如果你熟悉它们,我们将非常感谢帮助 .

VertexT和EdgeT被认为是多态基类 . 我的理解是bgl不是用于指向这些属性的指针 . 如何使用BGL处理多态顶点和边缘属性?我想过使用共享指针,但我更喜欢自己管理内存 . 此外,这似乎可以防止在使用boost :: get生成boost布局的位置图时出现问题 .

现在我只是通过让顶点包含另一个指向真正的多态类的指针来破解我的方式 . 但这似乎太复杂了 . 有什么建议?

2 回答

  • 0

    在算法的通用实现中,优选使用值语义:复制对象导致存在两个相同的对象,这些对象是独立的 . 当需要复制对象时,这是至关重要的属性 . 动态多态不能立即使用值语义,因为对于动态多态的使用,您需要处理指针或引用:使用值时,静态类型和对象的动态类型重合,不允许直接动态多态 .

    在这种情况下,处理动态多态对象的唯一方法是为它们提供值外观 . 实际上,这意味着您需要将指向对象的指针封装到公开所需值接口的对象中(如果您坚持,也可以封装引用,但我从未发现这种方法很有效) . 虽然我猜想使用像 boost::shared_ptr<T> 或_909903这样的东西会消除许多不必要的复杂情况,但Boost Graph库确实不重要 .

    所有这些说,我想指出,我很少找到动态多态对象与算法结合的有用示例!是的,有一些,但大多数时候使用动态多态性导致问题,而不是解决方案(尽管许多人只接触面向对象的技术说;但是,如果你知道唯一的工具是锤子,每个问题看起来像一个钉子) .

  • 7

    我认为你基本上解决了与这个问题相同的问题:

    仅适用于(捆绑)属性 . 我建议你可以通过调用独立的函数模板来实现多态性 .


    对于真正的大功率机械:

    另见本文件:On the Tension Between Object-Oriented and Generic Programming in C++;那篇论文描述了类型擦除,它是解决/解决运行时/静态多态性需求的最终方式 . (_注意,如果你需要实现类型擦除,Boost Variant,Boost Any等库会更方便) .

相关问题