C++

点構造体に配列っぽくアクセスする

More than 3 years have passed since last update.

コードを書いているとふとした必要から下記のような構造体を作ることは多いと思います。

struct Point {

int x;
int y;
int z;
}


使用例

int main(void){

Point p;
p.x = 100;
p.y = 200;
p.z = 300;

cout << "p = (" << p.x << ", " << p.y << ", " << p.z << ")\n";
}



出力

p = (100, 200, 300)


このような構造体を使っているとしばしば p[0], p[1], p[2] のように配列っぽく使いたくなることがあります。そのような場合には下記のオペレータを追加するとできます。

struct Point {

int x;
int y;
int z;

// x のアドレスを基準にしたインデックス位置の参照を返す
int& operator[] (int index) { return *(&x + index); }
};


使用例

int main(void){

Point p;
p.x = 100;
p.y = 200;
p.z = 300;

cout << "p = (" << p.x << ", " << p.y << ", " << p.z << ")\n";

p[0] = 10;
p[1] = 20;
p[2] = 30;
cout << "p = (" << p[0] << ", " << p[1] << ", " << p[2] << ")\n";
}



出力

p = (100, 200, 300)

p = (10, 20, 30)

オペレータを追加するのが面倒 or 外部ライブラリのためできない場合には下記のようにもできます。


使用例

int main(void){

Point p;

int* p2 = &p.x;
p2[0] = 10;
p2[1] = 20;
p2[2] = 30;

cout << "p = (" << p.x << ", " << p.y << ", " << p.z << ")\n";
}



出力

p = (10, 20, 30)