Информация об изменениях

Сообщение Re[5]: Приведение типов итераторов для контейнера с базовым от 12.01.2024 14:04

Изменено 12.01.2024 14:17 rg45

Re[5]: Приведение типов итераторов для контейнера с базовым
Здравствуйте, drVanо, Вы писали:

V>Последний вопрос — как это можно реализовать без boost?


Ну, просто реализуешь свой собственный класс итератора и обеспечиваешь его необходимым набором операций — сравнение, разыменование, инкремент и пр.

Вот здесь рабочий пример: http://coliru.stacked-crooked.com/a/1dd5cd283882b2d8

template <typename T>
class BaseImportListIteratorAdaptor
{
public:
   // Use concepts instead of the static_assert on C++20
   static_assert(std::is_base_of_v<BaseImport, std::remove_pointer_t<std::decay_t<T>>>);
   using BaseIterator = BaseImportList::const_iterator;

   BaseImportListIteratorAdaptor() = default;
   BaseImportListIteratorAdaptor(const BaseIterator& i) : m_baseIterator(i) {}

   T* operator*() const { return static_cast<T*>(*m_baseIterator); }

   bool operator == (const BaseImportListIteratorAdaptor& rhs) const  { return m_baseIterator == rhs.m_baseIterator; }
   bool operator != (const BaseImportListIteratorAdaptor& rhs) const { return !(*this == rhs); }

   BaseImportListIteratorAdaptor& operator++() { ++m_baseIterator; return *this; }
   BaseImportListIteratorAdaptor operator++(int) { return m_baseIterator++; }

private:
   BaseIterator m_baseIterator;
};


Просто чем хорош boost::iterator_adaptor — он определяет полный джентльменский набор всех атрибутов итератора — методы, типы, категорию и пр.

Да, еще один момент: адапторы итераторов, на самом деле, классная штука, с помощью которой можно адаптировать разного рода коллекции под конкретные нужды. Например, ты можешь подпилить этот адаптор так, чтоб он возвращал не указатели, а сразу ссылки на объекты. Снаружи это будет выглядеть как вектор объектов класса MacImport.
Re[5]: Приведение типов итераторов для контейнера с базовым
Здравствуйте, drVanо, Вы писали:

V>Последний вопрос — как это можно реализовать без boost?


Ну, просто реализуешь свой собственный класс итератора и обеспечиваешь его необходимым набором операций — сравнение, разыменование, инкремент и пр.

Вот здесь рабочий пример: http://coliru.stacked-crooked.com/a/1dd5cd283882b2d8

template <typename T>
class BaseImportListIteratorAdaptor
{
public:
   // Use concepts instead of the static_assert on C++20
   static_assert(std::is_base_of_v<BaseImport, std::remove_pointer_t<std::decay_t<T>>>);
   using BaseIterator = BaseImportList::const_iterator;

   BaseImportListIteratorAdaptor() = default;
   BaseImportListIteratorAdaptor(const BaseIterator& i) : m_baseIterator(i) {}

   T* operator*() const { return static_cast<T*>(*m_baseIterator); }

   bool operator == (const BaseImportListIteratorAdaptor& rhs) const  { return m_baseIterator == rhs.m_baseIterator; }
   bool operator != (const BaseImportListIteratorAdaptor& rhs) const { return !(*this == rhs); }

   BaseImportListIteratorAdaptor& operator++() { ++m_baseIterator; return *this; }
   BaseImportListIteratorAdaptor operator++(int) { return m_baseIterator++; }

private:
   BaseIterator m_baseIterator;
};


Просто чем хорош boost::iterator_adaptor — он определяет полный джентльменский набор всех атрибутов итератора — методы, типы, категорию и пр.

Да, еще один момент: адапторы итераторов, на самом деле, классная штука, с помощью которой можно адаптировать разного рода коллекции под конкретные нужды. Например, ты можешь подпилить этот адаптор так, чтоб он возвращал не указатели, а сразу ссылки на объекты. Снаружи MacImportList будет выглядеть как обычный вектор объектов класса MacImport.