、これは何です私はやります:
前者が利用できない場合は、すべてのオプションメンバーを適切な名前のstd::optional
またはそれと同等のものに置き換えてください。
using std::optional; // facilitates easy switching between std and boost if needed
class MyClass {
optional<int> some_value;
// Similarly for rest of attributes
void set_some_value(int value_to_store) { some_value = value_to_store; }
optional<int> get_some_value() { return some_value; }
}
MyClass instance;
// ... parse XML and set attributes
auto some_value = instance.get_some_value;
if (some_value) {
do_something_with_int(*some_value);
}
optional
に関する注意次のようにそれを行うからの読み取りに:
デフォルト・構築optional
sが空であるが。つまり、明示的に設定しない属性はすべてデフォルトでは空です。
空のオプションの参照解除は、未定義の動作です。それにアクセスするより安全な方法があります。この例では、とにかく属性の存在を分岐させたいと思っているので、手動でチェックしたので安全です。
管理オブジェクトは、割り当てられたoptional
オブジェクトの内部にあることが保証されています。これは、スピードに優れた動的割り当てを意味しません。ただし、大きなオブジェクトがある場合、スタックオーバーフローの問題が発生する可能性があります。しかし、大規模オブジェクトのほとんどの実際のシナリオでは、string
や、とにかくヒープ上にデータを保持するSTLコンテナ/ラッパーを使用しているため、そうは思わしくありません。
標準でスペースコストの記載が見つかりませんでした。私はそれが典型的にすべてのオプションのオブジェクト内に単一のbool
で実装されていると信じています。 sizeof(bool)
は、多くの場合、sizeof(int)
です。これにより、必要以上に多くのスペースが必要になりますが、可能な限り高速です。これは一般的には良いトレードオフですが、メモリ使用の問題が発生し、多くのオブジェクトがoptional
を保持している場合は、よりスペース最適なソリューションを見つける必要があります。センチネル値を使用して存在しないことを知らせることができる場合は、コンパクトなオプションのオブジェクトの実装を参照してください。
最後の箇条書きは、偽を返すことができ、または参照によって属性を返すことを意味します。もう少し具体的にして、「オプション」を返さなければならないと言うでしょう。 – AndyG
あなたは属性の存在を追跡する必要があると言いますが、存在する場合は参照を返したいとします。したがって、属性の存在のみを保持するデータ構造は不十分である。その情報のオブジェクトをクエリにすることができるときに、属性がXMLに含まれているかどうかを追跡する必要があるのはなぜですか? – patatahooligan
@andygはそれに応じてステートメントを更新しました。 – Sitesh