2011-08-11 12 views
2

複数の引数を取るオーバーロードされたoperator[]を定義することはできますか?C++のoperator []は複数の引数を取ることができますか?

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

を、後でこのようにそれを使用します。それは、私は次のようにoperator[]を定義することができ、ありますか?

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

(私の意見では、少なくとも):2つの引数をつけて関数を "get"、 "at"などにしてください。ほとんどの場合、operator()のオーバーロードよりもコードが明確になります。 –

5

号C++で

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

を、それがややぎこちないプロキシクラスが必要です。実際に何を望むかによって、2つの引数を持つ '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); 
関連する問題