3

所以我正在使用以下类型的提升图:

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

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

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

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

4

2 回答 2

8

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

在这种情况下,处理动态多态对象的唯一方法是给它们一个有价值的外观和感觉。实际上,这意味着您需要将指向对象的指针封装到暴露所需值接口的对象中(如果您坚持,您也可以封装引用,但我从未发现这很好用)。Boost Graph 库并不真正关心各种结构的内部表示方式,只要它们具有所需的接口并实现所需的语义即可。根据您的描述,使用包装器作为指向多态对象的指针是正确的方法。您是否通过标准智能指针之一或其他方式维护对象并不重要,尽管我猜想使用类似boost::shared_ptr<T>std::shared_ptr<T>消除了一些不必要的并发症。

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

于 2012-01-21T21:13:48.410 回答
1

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

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


对于真正的大功率机械:

另见这篇论文:关于 C++ 中面向对象和泛型编程之间的张力;那篇论文描述了类型擦除,这是一种最终的“解决方案”,可以解耦/桥接您的运行时/静态多态性需求。(_注意,如果您需要实现类型擦除,Boost Variant、Boost Any 等库会更方便)。

于 2012-01-19T15:55:49.330 回答