我知道在通用编程中,算法与容器是分离的。因此,将通用算法实现为实例方法是没有意义的(相同的算法应该适用于多个具体类;我们不想让它们都从一个 ABC 继承,因为它会成倍地增加类的数量)。
但是对于Boost Graph Librarysource()
中的函数,我不明白为什么它是全局函数而不是图形类的实例方法。
据我通过阅读BGL 源代码可知,source(e, g)
需要知道传递给它的图和边对象的实现细节;只知道它们的接口是不够的。
所以source()
不是通用算法。换句话说,它需要知道图实例的具体类。那为什么不把它和实例方法放在同一个类中呢?与创建一个需要为其调用的每个类定制的全局函数相比,它不会更干净/更少混乱吗?
更新
相关源代码:
// dwa 09/25/00 - needed to be more explicit so reverse_graph would work.
template <class Directed, class Vertex,
class OutEdgeListS,
class VertexListS,
class DirectedS,
class VertexProperty,
class EdgeProperty,
class GraphProperty, class EdgeListS>
inline Vertex
source(const detail::edge_base<Directed,Vertex>& e,
const adjacency_list<OutEdgeListS, VertexListS, DirectedS,
VertexProperty, EdgeProperty, GraphProperty, EdgeListS>&)
{
return e.m_source;
}
namespace boost {
namespace detail {
template <typename Directed, typename Vertex>
struct edge_base
{
inline edge_base() {}
inline edge_base(Vertex s, Vertex d)
: m_source(s), m_target(d) { }
Vertex m_source;
Vertex m_target;
};
}
}