Адаптер разыменования для итератора указателей

У меня есть контейнер, который отвечает за управление набором атрибутов. Класс частично выглядит примерно так:

class AttributeSet
{
public:
// ... interface is irrelevant for my question.

private:
std::vector<boost::shared_ptr<Attribute> > m_attributes;
};

Атрибут является полиморфным, поэтому атрибуты должны храниться как указатели, однако они никогда не могут быть NULL.

Я хочу использовать этот класс с BOOST_FOREACH, вот так:

BOOST_FOREACH(const Attribute &attribute, attributeSet)
{
...
}

Согласно документации BOOST_FOREACH,

Поддержка контейнеров STL очень общая; все, что выглядит как контейнер STL, считается. Если он имеет вложенные типы итераторов и const_iterator и функции-члены begin () и end (), BOOST_FOREACH автоматически знает, как выполнять итерации по нему.

Поэтому я обновил свой класс, чтобы он выглядел примерно так:

class AttributeSet
{
public:
typedef std::vector<boost::shared_ptr<Attribute> > container;
typedef container::iterator iterator;
typedef container::const_iterator const_iterator;

iterator begin();
iterator end();

const_iterator begin() const;
const_iterator end() const;

private:
container m_attributes;
};

Так что теперь я могу сделать это:

BOOST_FOREACH(const boost::shared_ptr<Attribute> &attribute, attributeSet)
{
...
}

Это хорошо, но мне не нравится, что он выставляет атрибуты как указатели. Со стороны вызывающего это шум и будет генерировать бессмысленные проверки NULL.

У меня есть несколько идей о том, как исправить проблему. Например, что-то вроде этого было бы неплохо:

class AttributeSet
{
public:
typedef std::vector<boost::shared_ptr<Attribute> > container;
typedef iterator_dereference_adapter< container::iterator > iterator;
typedef iterator_dereference_adapter< container::const_iterator > const_iterator;

iterator begin() { return iterator(m_attributes.begin()); }
iterator end() { return iterator(m_attributes.end()); }

const_iterator begin() const { return const_iterator(m_attributes.begin()); }
const_iterator end() const { return const_iterator(m_attributes.end()); }

private:
container m_attributes;
};

Класс iterator_dereference_adapter не требует пояснений. Это обернуло бы существующий итератор указателей и разыменовало бы значения указателя.

Итак, наконец, мой вопрос

Прежде чем я уйду и попытаюсь написать этот адаптер, есть ли что-то в STL или Boost, как этот класс?

Я открыт для других идей.

5

Решение

Boost имеет indirect_iterator который точно предназначен для переноса итератора к типу указателя и автоматической разыменования.

7

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector