web-dev-qa-db-ja.com

boost :: optionalからオブジェクトを取得する

メソッドが次のようなものを返すとします

boost::optional<SomeClass> SomeMethod()
{...}

今私がこのようなものを持っているとしましょう

boost::optional<SomeClass> val = SomeMethod();

今私の質問は、どのようにしてSomeClassをvalから抽出することができるのですか?

だから私はこのようなことをすることができました:

SomeClass sc = val ?
20
MistyD

逆参照演算子を使用できます。

_SomeClass sc = *val;
_

または、get()メソッドを使用できます。

_SomeClass sc = val.get();
_

これらは両方とも、基になるSomeClassオブジェクトへの左辺値参照を返します。

24
juanchopanza

オプションに値が含まれているかどうかを確認し、オプションで値を取得するには:

boost::optional<SomeClass> x = SomeMethod();
if (x)
     x.get();

オプションの値、または存在しない場合はデフォルト値を取得するには:

SomeMethod().get_value_or(/*default value*/)
10
Timothy Shields

前の回答で述べたように、逆参照演算子と関数get()は同じ機能を持っています。どちらも有効なデータを含めるにはオプションが必要です。

_if (val)
{
    // the optional must be valid before it can be accessed
    SomeClass sc1 = *val;
    SomeClass sc2 = val.get();
}
_

別の方法としては、関数value()があり、オプションが値を持たない場合に例外をスローします。

_// throws if val is invalid
SomeClass sc3 = val.value();
_

または、関数_value_or_および_value_or_eval_を使用して、値が設定されていない場合に返されるデフォルトを指定できます。

4
SebastianK