2015-03-17 1 views
0

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

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

или

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?

+2

Нет. Просто сделайте последнее. – metal

+1

Что возвращает 'getDefaultParam'? Если он вернет 'Param', # 2 не будет очень правильным (я не уверен, что' boost' разрешит его компиляцию, но это не сработает). Как правило, 'boost :: optional ' может быть заменен на 'Param const *', так как 'boost :: optional ' является неприемлемой ссылочной ссылочной ссылкой ... а также 'Param const *' , – Yakk

ответ

3

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

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

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

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

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

EDIT: На этом простом случае, это может быть не стоит приносить в 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 может быть уместным ,