https://stackoverflow.com/a/15828866/2160256
Как сказано там, мы не можем использовать диапазон, основанный на BGL, вот так:
for(auto e : boost::edges(g))
// do something with e
Однако здесь говорится, что мы можем перегрузить функции Begin() и End(), которые необходимы для использования диапазона на основе семантики. Итак, я попробовал:
template
I begin(std::pair& p)
{ return p.first;}
template
I end(std::pair& p)
{ return p.second;}
Однако компилятор по-прежнему жалуется:
ошибка: нет функции сопоставления для позвони
'begin(std::pair&)’
Что я делаю не так? Поиск по имени не работает? Или это все-таки невозможно?
Я также нашел этот ответ, который работает, но разве это не должно быть возможно и с оверлодингами свободных функций начала/конца?
С уважением, Марти
Кстати: мне очень утомительно писать
typename Graph::edge_iterator ebegin, eend;
std::tie(ebegin,eend) = boost::edges(_graph);
std::for_each(ebegin,eend,[&](const edge_descriptor& e){/*do something with e*/;});
ОБНОВЛЕНИЕ: C++17 теперь должен позволять следующее
auto [ebegin,eend] = boost::edges(_graph);
Подробнее здесь: https://stackoverflow.com/questions/271 ... r-iterator
Мобильная версия