3

次のパターンのいくつかの関数を含むコードに取り組んでいます

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つ:シリアライゼーションのためにクラスのサイズを変更したくない-私が取り組んでいる実装をまだ理解していません。

4

2 に答える 2

6

members へのポインターをチェックアウトすることもできます。これにより、提案 (3) をよりきれいに実装できます。

あなたのクラスがこのように見えるとしましょう。

class X {
public:
  memberType MemberVariable1;
  memberType MemberVariable2;
  memberType MemberVariable3;
};

次に、メンバー変数へのポインターの配列を定義します。

typedef memberType X::*MemberVar;
MemberVar ptrs[3] = {
  &X::MemberVariable1,
  &X::MemberVariable2,
  &X::MemberVariable3
};

次に、このような配列を使用できます。

X obj;
memberType var = obj.*(ptrs[index]);
于 2013-07-07T19:27:15.690 に答える