从boost::optional中检索对象

retrieving an object from boost::optional

本文关键字:检索 对象 optional boost      更新时间:2023-10-16

假设一个方法返回如下内容

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();
}

另一种选择是函数value(),如果可选项不携带值,则抛出异常。

// throws if val is invalid
SomeClass sc3 = val.value();

或者,函数value_orvalue_or_eval可用于指定在未设置值时返回的默认值。