イネマルのプログラミング備忘録

趣味プログラマーのメモ

C / C++ の共用体(union)を初歩的に使う

入門時にイマイチ使いどころがわからんかった共用体

プログラミングを初めて超初期のころ入門書で出会った
”union” ”共用体” のキーワード
自分の使っていた入門書では
構造体の直後位に解説されていて
いったいどこで使うの?
といった感じで放置していたが
最近使う機会があったので、一応覚書

(自分なりの)結論

キャストとかを駆使せずに”データにアクセスする手段”
記述法だけ似ている構造体とは別物と考えて良し

目的

構造体にオペレーターやキャストを使用せずに配列のようにアクセスする

確認用のプログラム

Vector3型風の構造体pos{ x y z } の各要素に”[ ]”でアクセスする。
本来ならposは配列でないので”[ ]”でアクセスできないが
共用体の機能でアクセスを可能にする
※動作確認は、VC2013

#include	<iostream>
#include	<array>

int main()
{
	using namespace std;

	union testUnion{
		struct { float x, y, z; } pos;
		array<float, 3> v;	// 純粋なCなら float v[3];
	};
	testUnion uni;

	uni.v[0] = 100.0f;		// uni.pos.x = 100; と同じ
	uni.v[1] = 200.1f;		// uni.pos.y = 100; と同じ
	uni.v[2] = 300.2f;		// uni.pos.z = 100; と同じ

	// つまりこう書ける
	for (int id = 0; id < 3; ++id){
		uni.v[id] += 0.5f;
	}

	// 値表示
	cout << uni.pos.x << endl;
	cout << uni.pos.y << endl;
	cout << uni.pos.z << endl;

	// 入力待ち
	rewind(stdin), getchar();
	return 0;
}

あとがき

記事にするほどのネタでもないけど入門時の自分が見たら
少しくらいは助かる気がしたので備忘録行き