2013-06-05 29 views
13

假設一個方法返回這樣的事情檢索從boost ::可選對象

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

現在假設我有這樣的事情

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

現在我的問題是我怎麼能提取出SomeClass的的val?

,這樣我可以做這樣的事情:

SomeClass sc = val ? 

回答

19

你可以使用去參考操作:

SomeClass sc = *val; 

或者,你可以使用get()方法:

SomeClass sc = val.get(); 

這兩個都返回一個左值參考SomeClass對象。

7

要檢查是否可選包含一個值,以及根據需要檢索:

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

。如果不存在的話得到了可選的值,或默認值:

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

由於在前面的答案中提到,去參考運算符和函數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可用於指定要在該情況下,未設置值返回默認值。