вернуть итератор в закрытую переменную, которая может быть использована с этой внутренней функцией-членом - PullRequest
0 голосов
/ 09 апреля 2020

Я хочу иметь возможность создать метод, подобный

void Vector<T>::foo()
{
  std::transform(this->begin(),this->end(),this->begin(), lambda)
}

, но если я сделаю мои функции начала / конца const, они возвращают const_iterator, иначе я не смогу использовать их с этим, пока внутри функции-члена , Есть ли способ сделать это?

 template <class T>
    class Vector 
        {
        public:
            Vector(std::vector<T> coords) : _coords(coords) {}
            class std::vector<T>::iterator begin() const { return _coords.begin(); }
            class std::vector<T>::iterator end() const { return _coords.end(); }
        private:
            std::vector<T> _coords;
        };

Я хочу иметь возможность использовать this-> begin () внутри функции

Ответы [ 2 ]

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

Как я понимаю, вам нужна постоянная и неконстантная перегрузка:

template <class T>
class Vector 
{
public:
    Vector(std::vector<T> coords) : _coords(coords) {}
    auto begin() const { return _coords.begin(); }
    auto end() const { return _coords.end(); }
    auto begin() { return _coords.begin(); }
    auto end() { return _coords.end(); }
    auto cbegin() const { return _coords.cbegin(); }
    auto cend() const { return _coords.cend(); }

    template <typename F>
    void foo(F f)
    {
        std::transform(cbegin(), cend(), begin(), f);
    }

private:
    std::vector<T> _coords;
};
0 голосов
/ 09 апреля 2020

Да, вы предоставляете const квалифицированную перегрузку

template <class T>
class Vector 
    {
    public:
        using iterator = typename std::vector<T>::iterator;
        using const_iterator = typename std::vector<T>::const_iterator;

        Vector(std::vector<T> coords) : _coords(coords) {}

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

        const_iterator begin() const { return _coords.begin(); }
        const_iterator end() const { return _coords.end(); }
    private:
        std::vector<T> _coords;
    };
...