2011-08-11 33 views
2

是否可以定義一個超過一個參數的超載operator[]?也就是說,我可以如下定義operator[]C++的運算符[]可以使用多個參數嗎?

//In some class 
    double operator[](const int a, const int b){ 
    return big_array[a+offset*b];} 

以後用它是這樣嗎?

double b=some_obj[7,3]; 

回答

5

不,你不能重載operator[]採取多個參數。取而代之的

double b = some_obj[7,3]; 

使用

double b = some_obj[7][3]; 

This answer介紹如何創建一個代理對象,以便能夠後者。

否則,您可以重載operator()以獲取2個參數。

+2

甚至更​​好(在我看來,至少):做一個函數「get」,「at」或類似的東西,有兩個參數。在大多數情況下,它會使代碼更清晰,而不是重載operator()。 –

5

號慣用的方式做,在C++是

double b = some_obj[7][3]; 
+1

雖然這並不一定是最好的方法,它需要有些尷尬的代理類,如果你做正確。根據你真正想要的內容,使用帶有兩個參數的'operator()'可以更簡單。 – leftaroundabout

3

沒有,C++的語法說,在

double b=some_obj[7,3]; 

逗號是逗號運算符,而不是逗號即分離參數。

1

更好的方法來做到這一點,因爲它不鎖定你創建臨時對象,並允許多個參數,是operator()。更多詳情請見C++ FAQ

2

底線:不,不要混淆你的用戶。

C++ FAQ

記住運算符重載的目的:降低成本,並在代碼 缺陷率,使用你的類。如果您創建的運營商認爲您的用戶感到困惑(因爲他們很酷,因爲他們使代碼更快,因爲您需要證明自己可以做到這一點; 並不重要),您違反了首先使用 運算符重載的全部原因。

1

你不能,但在這種情況下,我認爲一個函數會更好,因爲它不直觀你的操作員正在做什麼。

+0

它或多或少地模擬了一個Fortran風格的多維數組。 – Dan

2

你可以做什麼安德烈建議,或者你可以重載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); 
相關問題