извлечение объекта из boost :: необязательный

Предположим, что метод возвращает что-то вроде этого

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

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

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

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

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

SomeClass sc = val ?

17

Решение

Вы можете использовать оператор де-ссылки:

SomeClass sc = *val;

Кроме того, вы можете использовать get() метод:

SomeClass sc = val.get();

Оба из них возвращают lvalue ссылку на базовый SomeClass объект.

22

Другие решения

Чтобы проверить, содержит ли необязательное значение значение, и при необходимости получить его:

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

Чтобы получить необязательное значение или значение по умолчанию, если оно не существует:

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

Как уже упоминалось в предыдущих ответах, оператор разыменования и функция 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 может использоваться для указания значений по умолчанию, которые возвращаются в случае, если значение не установлено.

4