Я понимаю, что в общем программировании алгоритмы отделяются от контейнеров. Поэтому было бы бессмысленно реализовывать общий алгоритм как метод экземпляра (тот же алгоритм должен работать над несколькими конкретными классами, мы не хотим, чтобы все они наследовались от одной ABC, поскольку она экспоненциально увеличивала количество классов).Почему библиотека «Источники»() `) является глобальной функцией?
Но в случае source()
функция в Boost Graph Library, я не понимаю, почему это глобальная функция, а не метод экземпляра класса графа.
Насколько я мог сказать, прочитав BGL source code, source(e, g)
должен знать детали реализации графа и краевых объектов, передаваемых к нему; недостаточно знать только их интерфейсы .
Так что source()
не является общим алгоритмом. Другими словами, он должен знать конкретный класс экземпляра графа. Тогда почему бы не поместить его в тот же класс, что и метод экземпляра? Разве это не было бы намного более чистым/менее запутанным, чем создание глобальной функции, которая должна быть настроена для каждого класса, на который она призвана?
UPDATE
Соответствующий исходный код:
// 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;
};
}
}
Источник причины (a, b) не может быть специализирован на основе типов его параметров. Не все должно быть функцией-членом. Некоторые свободные функции можно рассматривать как часть интерфейса класса. Кроме того, может быть полезно использовать источник() в качестве прокладки. Не читая и не понимая код (который не доступен в течение 2 кликов ваших ссылок), я не мог сказать вам, что, поскольку я не использую библиотеку графов, но они могут быть предметом рассмотрения. В качестве альтернативы отправьте напрямую разработчикам BGL и спросите об их дизайнерском решении. Я надеюсь, что для этого есть веская причина. – Pete
Есть ли причина, по которой это вас беспокоит? – Pete
http://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197 –