5

私は多くのコンクリート構造体を持っており、フィールドをオプション(存在または非存在)として指定したいと思います。これを達成するために人々がどのようなアイデアを持っているのか疑問に思っています。構造体の例を次に示します(フィールドは他の構造体でもかまいません。構造体のベクトルでもかまいません)。

 struct LogonMessage_t
       {
          Header_t header; // this points to another struct containing all primitives
          std::string username;
          std::string password;
          std::vector<LogonOption_t> LogonOptions;
          int subaccountid;
          std::string Text;
       }

すべてのフィールドをデフォルトで非表示にし、おそらくセッターで1つずつ有効にします。これらの構造体が生成されるため、一般的な方法が望ましいでしょう。

これまでの私の考えは次のとおりです。

  1. フィールドが設定されているかどうかを示すフィールドのビットマップ
  2. 番兵の値を使用します(std::stringの場合は"\0"、intの場合は-1、floatの場合は-1.0f
  3. 各フィールドをカプセル化して、設定されているかどうかを示す、ある種のテンプレートコンテナ/プロキシ、アイデアはありますか?これが最善のアプローチかもしれないと思います。

ところで、フィールドをカプセル化するためにマップまたは他のSTLコンテナを使用することは、ここでは機能しません。それらは具体的な構造体である必要があります。

4

4 に答える 4

6

ブーストしたいようですね。オプション

于 2011-03-21T14:38:47.573 に答える
2

単純にする。定数を一緒にorで設定し、それらをandで検査することで設定できるフラグメンバー変数を使用します。

番兵の値の問題は、(現在および将来の)有効なフィールド値でもない値を選択することです。

于 2011-03-21T14:39:13.887 に答える
0

if (username.empty())文字列とベクトルの両方に空のデフォルト状態があり、などでテストできます。

Aの場合、subaccountid0は同様の空の値になると思います。それ以外の場合は、-1で問題ありません。

于 2011-03-21T14:38:18.070 に答える
0

旗を1つ使います。ヒープに値を保持する方法とスタックに値を保持する方法の2つの方法を提案できます。

最初にstd::pairを使用し、最初のフィールドは存在フラグです。2番目のアプローチは、boost :: shard_ptrを使用する方法です。ポインターが0を指している場合、フィールドは存在しません。

どちらの場合も、私のアドバイスは、Valueの要素に直接アクセスするのではなく、代わりにいくつかの関数を使用することです。const Value&value()const {return} Value&value(){return}

フランチェスコ

于 2011-03-21T14:52:53.170 に答える