这是一个非常基本的问题。在以下情况下使用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是否有任何好处?

最佳答案

首先,这很糟糕:

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可能是合适的。

关于c++ - 在以下用例中使用boost::optional有好处吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29108173/

10-17 01:41