1

私は現在、プロパティシステムを設計して、いくつかのクラスのメンバー変数をシリアライザーにバインドしようとしています。バインドごとに可能な限り最小限のコードを記述し、それでも柔軟性を持たせたいと考えています。

ゲッター/セッターはほとんどの場合実際には必要ないと思うので、実際に何かをトリガーするときにのみ使用されます。クラスは、変数名のリストと、変数へのポインター、またはゲッター/セッターへのポインターのいずれかを提供します。

私の質問は:

  • ポインターによるバインドは実際に危険ですか、それとも道徳的ですか?
  • これらのクラスは、実際のインスタンスを知らなくてもこれらのポインターを与えることができますか?(つまり、各クラスのすべてのインスタンスのバインディング情報を1回取得し、それをどこかに保存します)。AFAIK、Boost::bindはそれを許可していません。
4

2 に答える 2

1

boost::property_mapの使用を検討する必要があります

http://www.boost.org/doc/libs/1_49_0/libs/property_map/doc/property_map.html

于 2012-04-06T12:02:07.220 に答える
0

危険なはい、不道徳ないいえ。クラスをシリアライザーの友達にし、安全性を向上させるために人間の拘束力のあるものを隠すことができます。そうすれば、道徳的にお互いの内部構造について知ることができる一連の関連クラスができます。

クラスは、たとえばバイトオフセットとして、バインディング情報を確実に返すことができます。ただし、クラスがそのクラスの「プロトタイプ」オブジェクト(つまり、独自のタイプの静的メンバー)を所有している場合は、最も簡単な場合があります。次に、プロトタイプフィールドのアドレスをaとして取得し、const char *プロトタイプのアドレスからaとしても減算するconst char *ことにより、フィールドのバイトオフセットを取得します。

もちろん、フィールドがどのタイプであるかを確認する必要があります。これにより、バイトオフセットを指定してデータを正しく操作できます(たとえば、正しいポインタータイプにキャストバックできます)。

ただし、このような実装には多くの落とし穴があります。これは主に、オブジェクト内のサブオブジェクトへのポインターではなく、シリアル化時に正しいポインター型を使用していることを確認することを中心に展開されます。

于 2012-04-06T12:03:54.030 に答える