Я понимаю, что в универсальном программировании алгоритмы отделены от контейнеров. Таким образом, не имеет смысла реализовывать обобщенный алгоритм в качестве метода экземпляра (один и тот же алгоритм должен работать с несколькими конкретными классами; мы не хотим, чтобы все они наследуются от одного ABC, поскольку это приведет к экспоненциальному увеличению количества классов).
Но в случае с функцией source()
в Библиотека Boost Graph, я не понимаю почему это глобальная функция, а не метод экземпляра класса графа.
Насколько я мог судить, прочитав исходный код 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;
};
}
}
edge_base
раскрывает своегоm_source
члена. Если это часть его общедоступного интерфейса, то почему даже с функциейsource
можно было бы просто позволить людям получить прямой доступ кm_source
. Напишу разработчикам, просто подумал, может я что-то упускаю, потому что не знаком с C++. - person max   schedule 20.04.2013