C++ 创建多维迭代器

C++ 创建多维迭代器,c++,templates,multidimensional-array,casting,C++,Templates,Multidimensional Array,Casting,我在看: 我看到有一篇关于创建多维std::array的帖子,你可以这样做 阵列arr 并使用以下方法对其进行迭代: arr[0][…][n-1] 但是,该代码为您“创建”了std::array。相反,我试图编写类似的代码来包装一个已经存在的数组 你知道我怎样才能做到同样的事情吗?我尝试了以下操作,但出现了大量错误:l #include <iostream> #include <iterator> template<typename T, std::size_t

我在看:

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

阵列arr

并使用以下方法对其进行迭代:

arr[0][…][n-1]

但是,该代码为您“创建”了
std::array
。相反,我试图编写类似的代码来包装一个已经存在的数组

你知道我怎样才能做到同样的事情吗?我尝试了以下操作,但出现了大量错误: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;
}
#包括
#包括
模板
多类
{
受保护的:
T-ptr;
公众:
多(ptr):ptr(ptr){}
T*begin(){return&ptr[0];}
T*end(){return&ptr[size];}
T&运算符[](int I){return ptr[I];}
常量T&运算符[](int I)常量{return ptr[I];}
};
模板
类多重迭代器:私有多重迭代器
{
私人:
使用基本iter=多;
公众:
多迭代器(ptr):基迭代器(ptr){
使用base_iter::begin;
使用base_iter::end;
使用base_iter::operator[];
};
模板
类多重迭代器:私有多重迭代器
{
私人:
使用基本iter=多;
公众:
多迭代器(ptr):基迭代器(ptr){
使用base_iter::begin;
使用base_iter::end;
使用base_iter::operator[];
};
int main()
{
国际航空公司[4][4]=
{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}
};
多迭代器iter(&arr[0][0]);
用于(自动it:iter)
{
用于(自动jt:it)
{
}
}
返回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];}
错误:无法将“int**”转换为“multi_iterator*”
T*end(){return&ptr[size];}
错误:无法将“int*”转换为“int**”
T*end(){return&ptr[size];}
等等


有什么想法吗?

您当前的问题是模板类的迭代器访问器返回了错误的类型。将“multi”视为一个
向量
。在您的代码中,begin()返回一个
向量*
,而您想要返回的是
int*
。在这种情况下,您希望函数签名是

T** begin();
考虑一个普通的指针数组
int*[5]myPointerArray。本例中的“迭代器”是指向元素的指针,该元素是
int**