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

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

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

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

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

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

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

SomeClass sc = val ?

3 ответа

Решение

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

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

Другие вопросы по тегам