创建多维迭代器

时间:2014-03-15 15:30:59

标签: c++ templates multidimensional-array casting

我在看:less verbose way to declare multidimensional std::array

我看到有关于创建多维std::arrays的帖子,你可以这样做

array<int, 4, 4, 4> arr;

并使用:

进行迭代

arr[0][...][n-1]

然而,该代码&#34;创建&#34;你的std::arrays。相反,我试图编写类似的代码来包装已经存在的数组..

我有什么想法可以达到同样的目的吗?我尝试了以下但是遇到了大量错误:l

#include <iostream>
#include <iterator>


template<typename T, std::size_t size>
class multi
{
    protected:
        T ptr;

    public:
        multi(T ptr) : ptr(ptr) {}
        T* begin() {return &ptr[0];}
        T* end() {return &ptr[size];}

        T& operator [](int I) {return ptr[I];}
        const T& operator[](int I) const {return ptr[I];}
};

template <typename T, std::size_t thisSize, std::size_t ... otherSizes>
class multi_iterator : private multi<multi_iterator<T, otherSizes...>, thisSize>
{
    private:
        using base_iter = multi<multi_iterator<T, otherSizes...>, thisSize>;

    public:
        multi_iterator(T ptr) : base_iter(ptr) {}
        using base_iter::begin;
        using base_iter::end;
        using base_iter::operator [];
};

template <typename T, std::size_t thisSize>
class multi_iterator<T, thisSize> : private multi<T, thisSize>
{
    private:
        using base_iter = multi<T, thisSize>;

    public:
        multi_iterator(T ptr) : base_iter(ptr) {}
        using base_iter::begin;
        using base_iter::end;
        using base_iter::operator [];
};

int main()
{
    int arr[4][4] =
    {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12},
        {13, 14, 15, 16}
    };

    multi_iterator<int*, 4, 4> iter(&arr[0][0]);
    for (auto it : iter)
    {
        for (auto jt : it)
        {

        }
    }
    return 0;
}

错误是:

error: cannot convert 'int**' to 'multi_iterator<int*, 4ull>*' in return
         T* end() {return &ptr[size];}


error: cannot convert 'int*' to 'int**' in return
         T* end() {return &ptr[size];}

依旧......

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您的直接问题是您的模板类的迭代器访问器返回了错误的类型。将'multi'视为vector<int>。在您的代码中,begin()返回vector<int>*,当您要返回的内容为int*时。在这种情况下,您希望函数签名为

T** begin();

考虑一个普通的指针数组int*[5] myPointerArray;。在这种情况下,'迭代器'是指向元素的指针,它是int **