実行時にインデックスを指定してフィールドアドレスを指定できる言語構造は考えられません。「タイプ」配列に実際にフィールドサイズを含めることができれば、次のようなことができたでしょう:
istream &in = <get it somehow>;
size_t *field_size = <get it somehow>;
size_t num_of_fields = <get it somehow>;
A a;
char *ptr = reinterpret_cast<char *>(&a);
for (int i = 0; i < num_of_fields; i++)
{
in.read(ptr, field_size[i]);
ptr += field_size[i];
}
これは、クラスが単純で、仮想関数メンバーを持たない (またはそのようなクラスから継承する) 場合に当てはまることに注意してください。その場合は、クラス内でフィールドが始まるバイト オフセットを取得するためのダミー メンバーを含めることをお勧めします。
class A
{
int __dummy; /* must be the first data member in the class */
...
<rest of your class definition here>
};
次に、 ptrの初期化を次のように変更します。
ptr = reinterpret_cast<char *>(&a) + offsetof(A, __dummy);
このコードのもう 1 つの暗黙の前提は、このコードを実行するマシンとシリアル化されたデータを受信するマシンの両方で、マシンのバイト順が同じであるということです。そうでない場合は、ストリームから読み取ったデータのバイト順を変換する必要があります。もちろん、この変換は型に依存しますが、フィールドごとに別の変換関数の配列を持つことができます。