具有多个参数的C ++ 数组运算符?

我可以在C ++中定义一个具有多个参数的数组运算符吗? 我试过这样的:

const T& operator[](const int i, const int j, const int k) const{ return m_cells[k*m_resSqr+j*m_res+i]; } T& operator[](const int i, const int j, const int k){ return m_cells[k*m_resSqr+j*m_res+i]; } 

但是我得到这个错误:

 error C2804 binary operator '[' has too many parameters 

不,你不能重载operator[]接受多个参数。 你可以重载operator() 。 请参阅如何为Matrix类创build下标运算符? 来自C ++ FAQ。

无法将[]运算符重载为接受多个参数,但另一种方法是使用该代理模式

用两个字: a[x][y] ,第一个expression式( a[x] )将返回一个不同的types,名为proxytypes,它将会有另一个operator[] 。 它会调用像原始类的_storedReferenceToOriginalObject->At(x,y)

你将无法做a[x,y] ,但我想你想重载通常的C ++风格的二维数组语法。

你可以用C ++ 11中的统一初始化语法来做一个很好的小窍门。 而不是直接采取索引,你拿一个POD。

 struct indices { std::size_t i, j, k; }; T& operator[](indices idx) { return m_cells[idx.k * m_resSqr + idx.j * m_res + idx.i]; } 

然后使用新的语法:

 my_array<int> arr; // ... arr[{1, 2, 3}] = 42; 

为了完整起见,有一种方法可以使用多个参数实际使用括号运算符,如果它们不是基本数据types,即通过重载逗号运算符而不是括号运算符,请参阅以下关于逗号重载的文章:

https://stackoverflow.com/a/18136340/5836981

免责声明:在我看来,重载逗号运算符是容易出错的,并且使得代码更加模糊,只有在更奇特的情况下才值得考虑。 我添加了这个答案,因为我在一些代码中find了一个这样的实例,并且花了我一些时间才弄清楚这个键不是用[]运算符(不能用多个参数重载),而是运算符。

C ++中的任意types和大小的N维数组:

这个答案是由Pavel Radzivilovsky的答案所启发的,谢谢。 我有点难以实现实现,因为这是我第一次recursion模板。 我想分享我所做的事情,以便别人比我更快地理解。

我写了一个c ++模板类来创build任意types和大小的n维数组。 它需要用数组types和维数来实例化。 大小可以dynamic改变。 我在下面给出了如何创build一个multidimensional array的一个裸(剥离)工作版本,通过连续运用operator [] (例如array [x] [y] [z])可以访问元素。 该版本只能处理n> 1的维数组。 主函数显示如何创build一个4维整数数组作为例子。

编辑 :请记住,下面的例子是可读性最小的,因为它不会释放数组,也不会检查访问边界。 添加这个是微不足道的,留给程序员。

 #include <stdio.h> #include <stdlib.h> template <typename T, int N> struct array { array<T,N>() : data(NULL), offset((int*) malloc(sizeof(int)*N)){} array<T,N>(T *data, int *offset) : data(data), offset(offset){} array<T,N-1> operator[](int i){return array<T,N-1>(&data[i*offset[N]], offset);} bool resize(int *size){ offset[N-1] = 1; int total_size = size[N-1]; for(int i = N-2; i >= 0; i--){ total_size *= size[i]; offset[i] = offset[i+1]*size[i+1]; } return (data = (T*) realloc (data, total_size*sizeof(T))); } T *data; int *offset; }; template <typename T> struct array<T,1>{ array<T,1>(T *data, int *offset) : data(data){} T& operator[](int i){return data[i];} T *data; }; int main () { array<int, 4> a; // create array with dimensions [1][3][3][7] int size[4] = { 1, 3, 3, 7 }; a.resize(size); a[0][1][2][3] = 123; return 0; } 

请享用。