C++的operator []可以使用多个参数吗?

Dan*_*Dan 2 c++ operator-overloading subscript-operator

是否可以定义一个operator[]需要多个参数的重载?也就是说,我可以定义operator[]如下:

  //In some class
  double operator[](const int a, const int b){
     return big_array[a+offset*b];}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它?

double b=some_obj[7,3];
Run Code Online (Sandbox Code Playgroud)

mic*_*huu 6

在 C++23 之前这是不可能的。您可以从 C++23 执行此操作。

来自 cppreference

从 C++23 开始,operator[] 可以采用多个下标。例如,声明为 的 3D 数组类的运算符[]T& operator[](std::size_t x, std::size_t y, std::size_t z);可以直接访问元素。

那里的示例代码: https: //godbolt.org/z/993s5dK7z

来自 C++23 草案

struct X {
  Z operator[](std::initializer_list<int>);
  Z operator[](auto...);
};
X x;
x[{1,2,3}] = 7;                 // OK, meaning x.operator[]({1,2,3})
x[1,2,3] = 7;                   // OK, meaning x.operator[](1,2,3)
Run Code Online (Sandbox Code Playgroud)

因此,您发布的代码片段将在 C++23 中运行。


And*_*gia 5

不.在C++中这样做的惯用方法是

double b = some_obj[7][3];
Run Code Online (Sandbox Code Playgroud)

  • 虽然这不一定是最好的方法,但如果你做得好,它需要一些笨拙的代理类。根据您的实际需要,使用带有两个参数的 `operator()` 会更直接。 (2认同)

Pra*_*ian 5

不,你不能超载operator[]来采取多个参数.代替

double b = some_obj[7,3];
Run Code Online (Sandbox Code Playgroud)

使用

double b = some_obj[7][3];
Run Code Online (Sandbox Code Playgroud)

这个答案解释了如何创建代理对象以便能够使用后者.

否则,您可以重载operator()以获取2个参数.

  • 甚至更好(在我看来,至少):用两个参数创建一个"get","at"或类似的函数.在大多数情况下,它会使代码比重载operator()更清晰. (2认同)