2013-06-05 3 views
13

Предположим метод возвращает что-то вроде этогоизвлечения объекта из повышения :: опциональной

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

Теперь предположим, что у меня есть что-то вроде этого

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

Теперь мой вопрос, как я могу извлечь из SomeClass вал?

Так что я мог бы сделать что-то вроде этого:

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_or и value_or_eval могут быть использованы для определения значения по умолчанию, которые возвращаются в случае, если значение не установлено.

 Смежные вопросы

  • Нет связанных вопросов^_^