6

我一直在尝试将 boost optional 用于可以返回对象或 null 的函数,但我无法弄清楚。这是我到目前为止所拥有的。任何有关如何解决此问题的建议将不胜感激。

class Myclass
{
public:
    int a;
};

boost::optional<Myclass> func(int a)  //This could either return MyClass or a null
{
    boost::optional<Myclass> value;
    if(a==0)
    {
        //return an object
            boost::optional<Myclass> value;
        value->a = 200;

    }
    else
    {
        return NULL;
    }

    return value;
}

int main(int argc, char **argv)
{
    boost::optional<Myclass> v = func(0);
    //How do I check if its a NULL or an object

    return 0;
}

更新:

这是我的新代码,我在value = {200};

class Myclass
{
public:
    int a;
};

boost::optional<Myclass> func(int a)
{
    boost::optional<Myclass> value;
    if(a == 0)
        value = {200};

    return value;
}

int main(int argc, char **argv)
{
    boost::optional<Myclass> v = func(0);


    if(v)
        std::cout << v -> a << std::endl;
    else
        std::cout << "Uninitilized" << std::endl;
    std::cin.get();

    return 0;
}
4

1 回答 1

9

您的函数应如下所示:

boost::optional<Myclass> func(int a)
{
    boost::optional<Myclass> value;
    if(a == 0)
        value = {200};

    return value;
}

你可以通过强制转换来检查它bool

boost::optional<Myclass> v = func(42);
if(v)
    std::cout << v -> a << std::endl;
else
    std::cout << "Uninitilized" << std::endl;

它不是价值-> a = 200

不,不是。来自Boost.Optional.Docs

T const* optional<T (not a ref)>::operator ->() const ;

T* optional<T (not a ref)>::operator ->() ;
  • 要求: *这是初始化的
  • 返回: 指向包含值的指针。
  • 抛出:什么都没有。
  • 注意:要求是通过 BOOST_ASSERT() 断言的。

operator->定义中:

pointer_const_type operator->() const
{
    BOOST_ASSERT(this->is_initialized());
    return this->get_ptr_impl();
}

如果对象未初始化,则断言将失败。当我们写

value = {200};

我们用 初始化值Myclass{200}


注意,这value = {200}需要支持初始化列表(C++11 特性)。如果你的编译器不支持它,你可以像这样使用它:

Myclass c;
c.a = 200;
value = c;

或者为Myclasswithint作为参数提供构造函数:

Myclass(int a_): a(a_)
{

}

然后你可以写

value = 200;
于 2013-06-04T02:50:29.623 回答