繁体   English   中英

C++ 的 operator[] 可以接受多个参数吗?

[英]Can C++'s operator[] take more than one argument?

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

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

然后像这样使用它?

double b=some_obj[7,3];

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

double b = some_obj[7][3];

不,您不能重载operator[]以获取多个参数。 代替

double b = some_obj[7,3];

利用

double b = some_obj[7][3];

此答案解释了如何创建代理 object 以便能够使用后者。

否则,您可以重载operator()以获取 2 个 arguments。

不,C++ 语法在

double b=some_obj[7,3];

逗号是逗号运算符,而不是分隔 arguments 的逗号。

底线:不,不要混淆你的用户。

来自C++ 常见问题解答

记住运算符重载的目的:降低使用 class 的代码的成本和缺陷率。 如果你创建的操作符让你的用户感到困惑(因为它们很酷,因为它们使代码更快,因为你需要向自己证明你可以做到;不管为什么),你就违反了全部原因首先使用运算符重载。

您可以按照 Andrea 的建议进行操作,或者您可以重载operator()以获取两个 arguments:

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

// Then use it like this:
double b = some_obj(7, 3);

更好的方法是operator() ,因为它不会锁定您创建临时对象并允许多个 arguments 。 更多详细信息请参见 C++ 常见问题解答

你不能,但在这种情况下,我认为 function 会更好,因为你的操作员在做什么并不直观。

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

从 cppreference

从 C++23 开始,operator[] 可以带多个下标。 例如,3D 数组 class 的 operator[] 声明为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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM