所以我正在使用以下类型的增强图: 通用标签

VertexT和EdgeT都是保留我需要的许多属性的类。这些是捆绑的属性。我不确定我是否可以使用bgl的某些方式,因此,如果您熟悉它们,将不胜感激。

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

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

有帮助吗?

解决方案

在算法的通用实现中,最好使用值语义:复制对象会导致两个相同的对象存在,它们是独立的。当需要复制对象时,这是至关重要的属性。动态多态不能立即使用值语义,因为使用动态多态需要使用指针或引用:在使用值时,对象的静态类型和动态类型是重合的,因此直接不允许动态多态。 / p>

在这种情况下,处理动态多态对象的唯一方法是为它们提供有价值的外观。实际上,这意味着您需要将指向对象的指针封装到公开所需值接口的对象中(如果您坚持也可以封装引用,但我从来没有发现这行得通)。 Boost Graph库并不真正在乎各种结构在内部如何表示,只要它们具有所需的接口并实现所需的语义即可。按照您描述的方法,使用包装器包装指向多态对象的指针是正确的方法。尽管我猜想使用诸如boost::shared_ptr<T>std::shared_ptr<T>之类的东西可以消除许多不必要的复杂性,但是究竟是通过标准智能指针之一还是以不同的方式维护对象并不重要。

所有这些,我想指出的是,我很少找到有用的动态多态对象与算法结合的示例!是的,在大多数情况下,动态多态性的使用是导致问题的原因,而不是解决方案的原因(尽管许多人只接触过面向对象技术;但是,如果您知道的唯一工具是锤子, ,每个问题都像钉子一样。)

其他提示

我认为您基本上正在解决与此问题相同的问题:

  • C ++和通用图距离算法

    仅适用于(捆绑的)属性。我建议您可以通过调用独立功能模板来实现多态。


    对于真正的大功率机械:

    另请参阅本文:关于C ++中的面向对象编程与通用编程之间的张力;该论文描述了类型擦除,这是最终的“解决方案”,可以解耦/桥接您的运行时/静态多态性需求。(_注意,如果您需要实现类型擦除,则诸如Boost Variant,Boost Any之类的库会更加方便。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top