Подтвердить что ты не робот

Получение объекта из boost:: optional

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

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

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

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

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

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

SomeClass sc = val ?
4b9b3361

Ответ 1

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

SomeClass sc = *val;

В качестве альтернативы вы можете использовать метод get():

SomeClass sc = val.get();

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

Ответ 2

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

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

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

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

Ответ 3

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