Предположим, что метод возвращает что-то вроде этого
boost::optional<SomeClass> SomeMethod()
{...}
Теперь предположим, что у меня есть что-то вроде этого
boost::optional<SomeClass> val = SomeMethod();
Теперь мой вопрос, как я могу извлечь SomeClass из Val?
Чтобы я мог сделать что-то вроде этого:
SomeClass sc = val ?
Вы можете использовать оператор де-ссылки:
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*/)
Как уже упоминалось в предыдущих ответах, оператор разыменования и функция 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
может использоваться для указания значений по умолчанию, которые возвращаются в случае, если значение не установлено.