2012-04-16 3 views
6

У меня есть std::multimap, и я хочу создать boost::iterator_range от equal_range. Я не нашел простой способ сделать это в документации, поэтому я попытался следующее:Преобразование std :: пара итераторов для boost :: iterator_range

typedef std::multimap<int, std::string> Map; 
Map map; 
... 
boost::iterator_range<Map::iterator> r(map.equal_range(2)); 

Удивительно, но это работает (с помощью GCC 4.1.2). Мне любопытно, как это работает. Я не нашел перегрузки для конструктора iterator_range, который сделал бы это, и multimap::iterator_range явно не имеет перегрузки, которая возвращала диапазоны Boost.

+1

Обратите внимание, что существует также 'boost :: make_iterator_range', который выводит из этой пары тип итератора. – alfC

ответ

7

iterator_range_core.hpp:

//! Constructor from a Range 
template< class Range > 
iterator_range(const Range& r) : 
    m_Begin(impl::adl_begin(r)), m_End(impl::adl_end(r)) 
{} 

impl::adl_begin принимает вас boost::begin. Посмотрев на begin.hpp мы видим (среди других вуду):

template< typename Iterator > 
inline Iterator range_begin(const std::pair<Iterator,Iterator>& p) 
{ 
    return p.first; 
} 

И для примера, как типы могут быть «адаптированы» в диапазонах имеют вид here (они используют pair в качестве примера).

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