假设一个方法返回类似这样的东西
boost::optional<SomeClass> SomeMethod()
{...}
现在假设我有这样的东西
boost::optional<SomeClass> val = SomeMethod();
现在我的问题是如何从 val 中提取 SomeClass ?
这样我就可以做这样的事情:
SomeClass sc = val ?
假设一个方法返回类似这样的东西
boost::optional<SomeClass> SomeMethod()
{...}
现在假设我有这样的东西
boost::optional<SomeClass> val = SomeMethod();
现在我的问题是如何从 val 中提取 SomeClass ?
这样我就可以做这样的事情:
SomeClass sc = val ?
您可以使用取消引用运算符:
SomeClass sc = *val;
或者,您可以使用以下get()
方法:
SomeClass sc = val.get();
这两个都返回对底层SomeClass
对象的左值引用。
要检查可选项是否包含值,并可选择检索它:
boost::optional<SomeClass> x = SomeMethod();
if (x)
x.get();
获取可选值,如果不存在则获取默认值:
SomeMethod().get_value_or(/*default value*/)
如前面的答案所述,取消引用运算符和函数get()
具有相同的功能。两者都要求可选项包含有效数据。
if (val)
{
// the optional must be valid before it can be accessed
SomeClass sc1 = *val;
SomeClass sc2 = val.get();
}
另一种方法是 function value()
,如果 optional 不携带值,则会引发异常。
// throws if val is invalid
SomeClass sc3 = val.value();
或者,函数value_or
和value_or_eval
可用于指定在未设置值的情况下返回的默认值。