Ответ 1
Вы можете использовать оператор de-reference:
SomeClass sc = *val;
В качестве альтернативы вы можете использовать метод get()
:
SomeClass sc = val.get();
Оба из них возвращают ссылку lvalue на базовый объект SomeClass
.
Предположим, что метод возвращает что-то вроде этого
boost::optional<SomeClass> SomeMethod()
{...}
Теперь предположим, что у меня есть что-то вроде этого
boost::optional<SomeClass> val = SomeMethod();
Теперь мой вопрос: как я могу извлечь SomeClass из val?
Чтобы я мог сделать что-то вроде этого:
SomeClass sc = val ?
Вы можете использовать оператор de-reference:
SomeClass sc = *val;
В качестве альтернативы вы можете использовать метод get()
:
SomeClass sc = val.get();
Оба из них возвращают ссылку lvalue на базовый объект SomeClass
.
Чтобы проверить, содержит ли опциональное значение значение, и необязательно получить его:
boost::optional<SomeClass> x = SomeMethod();
if (x)
x.get();
Чтобы получить необязательное значение или значение по умолчанию, если оно не существует:
SomeMethod().get_value_or(/*default value*/)
Как упоминалось в предыдущих ответах, оператор 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_or
и value_or_eval
могут использоваться для указания значений по умолчанию, которые возвращаются в случае, если значение не установлено.