Выгода от использования boost:: optional в следующем примере использования?

Это очень принципиальный вопрос. Есть ли какая-либо польза от использования boost:: optional в следующем сценарии:

int somefunction(boost::optional<const Param&> value = getDefaultParam()){
    return value->dosomething();
}

or

int somefunction(boost::optional<const Param&> value){
    if (!value) 
            value = getDefaultParam();
    return value->dosomething();
}

вместо того, чтобы просто сделать это:

int somefunction(const Param& value = getDefaultParam()){
    return value.dosomething();
}

Это для конкретного случая, когда я знаю, что инициализирую объект Param значением по умолчанию. Может ли быть какая-либо польза от использования boost:: optional в Param для API или клиента API?


person SkypeMeSM    schedule 17.03.2015    source источник
comment
Нет. Просто сделайте последнее.   -  person metal    schedule 17.03.2015
comment
Что возвращает getDefaultParam? Если он возвращает Param, #2 будет не очень правильным (я не уверен, что boost позволит ему скомпилироваться, но это не сработает). Как правило, boost::optional<const Param&> можно заменить на Param const*, так как boost::optional<const&> является невладеющей переустанавливаемой ссылкой, допускающей значение NULL... как и Param const*.   -  person Yakk - Adam Nevraumont    schedule 17.03.2015


Ответы (1)


Во-первых, это плохо:

int somefunction(boost::optional<const Param&> value = getDefaultParam()){
    return value->dosomething();
}

someFunction можно вызвать с помощью boost::none, и в этом случае попытка доступа к его значению вызовет исключение.

Во-вторых, если у вас есть boost::optional<const Param&>, предоставляется API для получения его значения или значения по умолчанию:

boost::optional<const Param&> value = ...;
value.value_or(getDefaultParam()).doSomething();

РЕДАКТИРОВАТЬ: В этом простом случае, возможно, не стоит вводить optional. Если вы сделаете что-то вроде этого:

int someFunc(const Param& value = getDefaultParam())
{
    return value.doSomething();
}

// Elsewhere...
int x = someCondition ? someFunc(abc) : someFunc();

Здесь действительно нет смысла для optional. Конечно, что-то простое вроде этого, someFunc тоже может не сильно понадобиться:

int x = (someCondition ? abc : getDefaultParam()).doSomething();

Однако, если вам нужно более длительное хранение/отслеживание того, доступно ли значение или нет, тогда может подойти boost::optional.

person Matthew Moss    schedule 17.03.2015