косвенный_тератор для карты & lt; T, shared_ptr & lt; U & gt; & gt;

Я пытаюсь реализовать итератор map<T, shared_ptr<U>> что «удаляет» shared_ptrто есть ссылки на pair<T, U&>, Мне нужно это, чтобы адаптировать мою обертку map на основе диапазона для цикла.

boost::indirect_iterator кажется, что-то разработанное для такой необходимости. Я попробовал это:

typedef std::map<int, std::shared_ptr<int>> M;
typedef boost::indirect_iterator<M::iterator, std::pair<int, int>> It;

Это не работает из-за indirect_iterator Требование:

Выражение * v, где v является объектом iterator_traits :: value_type, должно быть допустимым выражением и может быть преобразовано в ссылку.

Можно ли использовать boost::indirect_iterator для этой задачи? Если нет, могу ли я сделать это с boost::iterator_adaptor?

2

Решение

Благодаря комментарию @Xeo, решение заключается в использовании Boost.Range. Что мне удалось получить от VC10

#include <boost/range/adaptor/map.hpp>
#include <boost/range/adaptor/indirected.hpp>

#if defined(_MSC_VER) && _MSC_VER <= 1600 // VC10
template< class T >
typename std::add_rvalue_reference<T>::type declval();
#endif

class Wrapper
{
private:
typedef std::map<T, std::shared_ptr<U>> Container;

public:
typedef decltype(declval<Container&>() | boost::adaptors::map_values | boost::adaptors::indirected) IteratorRange;
typedef decltype(declval<Container&>() | boost::adaptors::map_values | boost::adaptors::indirected) ConstIteratorRange;
typedef IteratorRange::iterator Iterator;
typedef ConstIteratorRange::const_iterator ConstIterator;

Iterator begin()
{
return iteratorRange().begin();
}

// by analogy
ConstIterator begin() const;
ConstIterator cbegin() const;
Iterator end();
ConstIterator end() const;
ConstIterator cend() const;

private:
IteratorRange iteratorRange()
{
return container | boost::adaptors::map_values | boost::adaptors::indirected;
}

ConstIteratorRange iteratorRange() const;

private:
Container container;
};
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]