2015-09-22 2 views
0

Я читаю чьи-то коды. Это функция из библиотеки ускорителей. Это оригинальное определение функции.Почему аргументы функций BGL разделены точками, а не запятыми?

void dijkstra_shortest_paths 
     (const Graph& g, 
     typename graph_traits<Graph>::vertex_descriptor s, 
     PredecessorMap predecessor, DistanceMap distance, WeightMap weight, 
     VertexIndexMap index_map, 
     CompareFunction compare, CombineFunction combine, DistInf inf, DistZero zero, 
     DijkstraVisitor vis, ColorMap color = default) 

Это часть кода, которую я выбрал из чьего-то. Он работает, но я просто не понимаю, почему он использовал точку между predecessor_map weight_map и distance_map вместо запятой? Сколько параметров он передал в функцию?

dijkstra_shortest_paths(graph, source_vertex, 
          predecessor_map(&predecessors[0]) 
          .weight_map(get(&Edge::cost, graph)) 
          .distance_map(&distances[0])); 
+3

Huh ?? Точечные и запятые операторы являются ортогональными функциями? О чем вы действительно спрашиваете? –

+0

Я спутал точку в predecessor_map (& предшественники [0]) .weight_map (get (& Edge :: cost, graph)) .distance_map (& distance [0]) Я думаю, что это должна быть запятая, чтобы отделить разные параметры. с помощью '.' означает, что это класс, а затем член, а затем член под этим членом. – daydayup

+2

Вопрос будет лучше сформулирован как «Я не знаю, что здесь происходит. Похоже, что аргументы передаются отдельно с помощью' .' вместо a ',' ". Открытые вопросы ** гораздо менее запутывают **. Ваше недоразумение не позволяет людям увидеть ответ. – sehe

ответ

5

documentation объясняет, что происходит:

Многие из алгоритмов Boost.Graph имеют длинный список параметров, большинство из которых имеют значения по умолчанию. Это вызывает ряд проблем.

[...]

Лучшее решение обеспечивается bgl_named_params. Этот класс позволяет пользователям предоставлять параметры в любом порядке и сопоставляет аргументы с параметрами на основе имен параметров.

[...]

Каждого из аргументов передаются функция, чье имя указует, какой параметр аргумент для. Каждый из названных параметров равен , разделенных точкой, а не запятой.

[...]

Обычно пользователь никогда не нужно иметь дело с bgl_named_params класса непосредственно, поскольку существуют такие функции, как boost::weight_map, которые создают Экземпляр bgl_named_params.

См. Также What is the “Named Parameter Idiom”?.

 Смежные вопросы

  • Нет связанных вопросов^_^