Возможно ли определить необязательный итератор для функции, которая изменит поведение функции на основе ее наличия или нет?Передача необязательного итератора функции
Чтобы дать конкретный пример рассмотрим определение
template<typename Graph,
typename random_access_iterator_distances,
typename random_access_iterator_predecessors,
typename back_insertor_iterator_frontier,
typename back_insertor_iterator_explored >
void dijkstra(const Graph &g,
const typename boost::graph_traits <Graph>::vertex_descriptor source,
random_access_iterator_distances distances,
random_access_iterator_predecessors predecessors,
const typename boost::graph_traits <Graph>::vertex_descriptor target = -1,
back_inserter_iterator_frontier frontier = null_iterator,
back_inserter_iterator_explored explored = null_iterator);
Если null_iterator
будет какая-то значение, которое указывает пользователю не хочет этот вывод.
Обход для этого путем определения двух отдельных функций, один с границей и исследованных в определении, другой без него, не будет хорошей альтернативой, поскольку это потребует дублирования кода (поскольку логика в функции тесно связана с ли либо frontier
или explored
присутствует.)
есть somekind рисунка или замены null_iterator
, чтобы сделать этот тип кода, реализуемый в C++?
Как насчет 'повышение :: опциональный '? –
@KerrekSB: Можете ли вы подробнее рассказать об этом, это похоже на перспективное решение? – ldog
Ну, введите аргумент функции, который является 'boost :: optional', возможно, по умолчанию, а затем функция может проверить, прошел ли итератор или нет. –