2013-06-05 5 views
13

方法を仮定し、このはブースト::オプションからオブジェクトを取り出す

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

のようなものを返す今、私の質問は、私は外の工assをどのように抽出することができますされて、私は今、この

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

のようなものがあるとしヴァル?

私はこのような何かを行うことができるように:

SomeClass sc = val ? 

答えて

19
あなたがデリファレンス演算子を使用することができ

SomeClass sc = val.get(); 
:また

SomeClass sc = *val; 

は、あなたがget()メソッドを使用することができます

これらの両方とも、下位のへの左辺参照を返します。オブジェクトです。

7

オプションに値が含まれ、必要に応じてそれを取得するかどうかを確認するには、次の

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

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

SomeMethod().get_value_or(/*default value*/) 
3

として、 de-reference演算子と関数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_orvalue_or_eval値が設定されていない場合に返されるデフォルト値を指定するために使用することができます。