Как перегрузить оператор разыменования std :: list для range-based for? - PullRequest
2 голосов
/ 29 апреля 2020

Я пытаюсь обработать std::list типа указателя, например:

std::list<int*> pNums;

Первоначально итерация этого контейнера с на основе диапазона для l oop будет выглядеть this:

for(int* pNum : pNums)
{
    std::cout << (*pNum) << std::endl;
}

Однако я хочу повторить этот контейнер с значением , а не с указателем , как показано ниже:

for(int num : Range(pNums))
{
    std::cout << num << std::endl;
}

| Здесь Range - это пользовательский класс упаковки std::list<int*>, что-то должно быть определено следующим образом, я думаю:

class Range
{
    Range(std::list<int*>& _list) : list(_list) {}
    std::list<int*>& list;

    // Basically inherit the original iterator
    class custom_const_iterator : std::list<int*>::const_iterator
    {
        // Define an overloaded dereference operator
        const int& operator*() const
        {
            ...
        }
        ...
    };

public:
    custom_const_iterator begin() { return ...; }
    custom_const_iterator end()   { return ...; }
};

Итак, мой вопрос, что я должен записать для класса Range * * 1023

1 Ответ

1 голос
/ 29 апреля 2020

Я бы выбрал следующий подход (объяснение в комментариях):

class Range
{
private:
    // Store iterators to the begin and the end of the range, 
    // rather than a reference to the whole list
    std::list<int*>::const_iterator first;
    std::list<int*>::const_iterator last;

    class iterator
    {
    private:
        std::list<int*>::const_iterator it;

    public:
        explicit iterator(std::list<int*>::const_iterator i) : it(i) {}

        // you should define all the other operators
        // that a std::list iterator has!
        iterator& operator++()
        { 
            ++it;
            return *this;
        }
        iterator operator++(int)
        {
            it++; 
            return *this;
        }

        // just dereference to get the value
        const int& operator*() const { return **it; }

        // these two are quite important for basic functionality
        bool operator==(const iterator& rhs) const { return it == rhs.it; }
        bool operator!=(const iterator& rhs) const { return it != rhs.it; }
    };

public:
    Range(std::list<int*>& _list) 
        : first(_list.begin()), last(_list.end()) 
    {}

public:
    iterator begin() { return iterator(first); }
    iterator end()   { return iterator(last); }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...