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 オブジェクトをデフォルト値に初期化していることがわかっている特定のケースです。API または API のクライアントに対して Param で boost::optional を使用する利点はありますか?

4

1 に答える 1

3

まず、これは悪いです:

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適切な場合があります。

于 2015-03-17T19:43:36.057 に答える