我在看: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];}
依旧......
有什么想法吗?
答案 0 :(得分:0)
您的直接问题是您的模板类的迭代器访问器返回了错误的类型。将'multi'视为vector<int>
。在您的代码中,begin()返回vector<int>*
,当您要返回的内容为int*
时。在这种情况下,您希望函数签名为
T** begin();
考虑一个普通的指针数组int*[5] myPointerArray;
。在这种情况下,'迭代器'是指向元素的指针,它是int **
。