[英]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 执行此操作。
从 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
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.