次のパターンのいくつかの関数を含むコードに取り組んでいます
memberType* var = NULL;
switch(someVariable)
{
case 0: var = &object.MemberVariable1; break;
case 1: var = &object.MemberVariable2; break;
case 2: var = &object.MemberVariable3; break;
}
メンバー変数は同じ型です。一部のスイッチでは、基本的に単なるデータで関数本体が乱雑になる数十のケースがあります。入力値に基づいてメンバーにアクセスできるように、配列、マップなどを作成したいと思います。
私は次のようなものを持つことを考えています
sometype array[size] = {member1, member2, member3}
そのため、関数には次を含めることができます
memberType* var = array[index];
スイッチ代わりに。
1. 最初に考えたのは、個々のメンバー変数と配列を含むクラスで共用体を作成することでした。これにより、個々のメンバーにアクセスするか、配列 + インデックスを介してそれらにアクセスできます。これは醜く、一見するとコードからは明らかではなく、メンバー vars を連続して宣言する必要があります。また、異なるインデックスの同じメンバー変数にアクセスすることもできません。
2. 個々のメンバー変数を返す関数への関数ポインターを含む配列があると、大量の 1 行の getter 関数を作成する必要があります。
3. 静的に割り当てられたオブジェクトを持っているので、次のようなことができます
int offsets[size] = {
*(int*)&staticObject.member1 - *(int*)&staticObject,
*(int*)&staticObject.member2 - *(int*)&staticObject,
*(int*)&staticObject.member3 - *(int*)&staticObject}
そしてそれを使う
var = (memberType*)(*(int*)&object + offsets[index]);
ひどいです。
この不必要に冗長なパターンを取り除く良い方法はありますか?
免責事項: 例で使用されているコードはテストしていません。これは説明用です。
編集:私が言及するのを忘れていた重要なことの1つ:シリアライゼーションのためにクラスのサイズを変更したくない-私が取り組んでいる実装をまだ理解していません。