Сообщение 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
Просто чем хорош boost::iterator_adaptor — он определяет полный джентльменский набор всех атрибутов итератора — методы, типы, категорию и пр.
Да, еще один момент: адапторы итераторов, на самом деле, классная штука, с помощью которой можно адаптировать разного рода коллекции под конкретные нужды. Например, ты можешь подпилить этот адаптор так, чтоб он возвращал не указатели, а сразу ссылки на объекты. Снаружи MacImportList будет выглядеть как обычный вектор объектов класса MacImport.
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.
Re[5]: Приведение типов итераторов для контейнера с базовым
Здравствуйте, drVanо, Вы писали:
V>Последний вопрос — как это можно реализовать без boost?
Ну, просто реализуешь свой собственный класс итератора и обеспечиваешь его необходимым набором операций — сравнение, разыменование, инкремент и пр.
Вот здесь рабочий пример: http://coliru.stacked-crooked.com/a/1dd5cd283882b2d8
Просто чем хорош boost::iterator_adaptor — он определяет полный джентльменский набор всех атрибутов итератора — методы, типы, категорию и пр.
Да, еще один момент: адапторы итераторов, на самом деле, классная штука, с помощью которой можно адаптировать разного рода коллекции под конкретные нужды. Например, ты можешь подпилить этот адаптор так, чтоб он возвращал не указатели, а сразу ссылки на объекты. Снаружи MacImportList будет выглядеть как обычный контейнер объектов класса MacImport.
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.