C++的运算符[]可以接受多个参数吗?
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];
不能重载operator[]
以获取多个参数。而不是
double b = some_obj[7,3];
使用double b = some_obj[7][3];
这个答案解释了如何创建一个代理对象来实现后者。
否则,您可以重载operator()
以接受2个参数。
No。在c++中惯用的方法是
double b = some_obj[7][3];
在c++ 23之前,这是不可能的。你可以从c++ 23开始做。
从cppreference:
从c++ 23开始,操作符[]可以接受多个下标。例如,声明为
T& operator[](std::size_t x, std::size_t y, std::size_t z);
的3D数组类的操作符[]可以直接访问元素。
示例代码:https://godbolt.org/z/993s5dK7z
From c++ 23 draft:
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中工作。
不,c++语法说在
double b=some_obj[7,3];
逗号是逗号操作符,而不是分隔参数的逗号。
底线:不,不要混淆你的用户
选自c++ FAQ:
请记住操作符重载的目的:减少开销和使用您的类的代码中的缺陷率。如果你创建运算符迷惑你的用户(因为他们很酷,因为他们编写代码)更快,因为你需要向自己证明你可以做到;为什么并不重要),你已经违背了使用的全部理由操作符重载。
您可以按照Andrea的建议做,或者您可以重载operator()
以接受两个参数:
// 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()
,因为它不会将您锁定在创建临时变量并且允许多个参数。
你不能,但在这种情况下,我认为函数会更好,因为它不是直观的你的操作符在做什么。
相关文章:
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- 运算符重载:"operator+"必须采用零个或一个参数
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 参数相关查找和流运算符重载
- C++:使用运算符 = 调用多参数构造函数
- 了解布尔运算符==(参数 1,参数 2)
- 我能否根据其运算符()的签名专门化可变参数模板参数
- SFINAE 检查模板参数运算符
- 不允许运算符 const 参数调用 const 成员函数
- 为私有结构定义双参数运算符重载
- C++ 通过自定义赋值运算符隐式转换函数参数
- 函数参数变量总是需要 & 或 * 运算符吗?
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 可变参数模板参数转发使用逗号运算符
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- 具有两个或多个模板参数的 C++ assigment 运算符
- 将多个参数传递给运算符 []
- 如何使用类的参数重载运算符+?
- 不允许在C++中使用多参数运算符 [] 的根本原因