在以下用例中使用 boost::optional 有好处吗?
Benefit from using boost::optional in the following usecase?
这是一个非常基础的问题。在以下情况下使用 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 对象初始化为默认值的特定情况。在 Param 上使用 boost::optional 对 API 或 API 的客户端有什么好处吗?
首先,这很糟糕:
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();
但是,如果您需要长期 storage/tracking 判断某个值是否可用,那么 boost::optional
可能是合适的。
这是一个非常基础的问题。在以下情况下使用 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 对象初始化为默认值的特定情况。在 Param 上使用 boost::optional 对 API 或 API 的客户端有什么好处吗?
首先,这很糟糕:
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();
但是,如果您需要长期 storage/tracking 判断某个值是否可用,那么 boost::optional
可能是合适的。