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)
在 C++23 之前这是不可能的。您可以从 C++23 执行此操作。
从 C++23 开始,operator[] 可以采用多个下标。例如,声明为 的 3D 数组类的运算符[]
T& operator[](std::size_t x, std::size_t y, std::size_t z);可以直接访问元素。
那里的示例代码: https: //godbolt.org/z/993s5dK7z
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 中运行。
不.在C++中这样做的惯用方法是
double b = some_obj[7][3];
Run Code Online (Sandbox Code Playgroud)
不,你不能超载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个参数.