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 回答