2013-06-05 15 views
13

Załóżmy, że metoda zwraca coś jak tenpobierania obiektu z boost :: opcjonalnym

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

Załóżmy teraz mam coś takiego

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

teraz moje pytanie jest w jaki sposób można wyodrębnić SomeClass z val?

tak, że mogę zrobić coś takiego:

SomeClass sc = val ? 

Odpowiedz

19

Można użyć operatora de-reference:

SomeClass sc = *val; 

Alternatywnie, można użyć metody get():

SomeClass sc = val.get(); 

Oba zwracają wartość l-wartości do podstawowej SomeClass obiekt.

7

Aby sprawdzić, czy opcja zawiera wartość, i ewentualnie je odzyskać:

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

Aby uzyskać wartość opcjonalna, lub wartość domyślną, jeśli nie istnieją:

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

Jak wspomniano w poprzednich odpowiedziach, operator de-reference i funkcja get() mają tę samą funkcjonalność. Oba wymagają opcjonalne, aby zawierać poprawne dane.

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

Alternatywą jest funkcją value(), który zgłasza wyjątek, jeżeli opcja nie prowadzi wartość.

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

Alternatywnie, funkcje value_orvalue_or_eval i mogą być użyte do określenia wartości domyślne, które są zwracane w przypadku, gdy wartość nie jest ustawiony.

Powiązane problemy