簡體   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