[英]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.