如何使用std :: unique_ptr成员变量抛出异常

时间:2017-02-13 19:18:50

标签: c++ exception move unique-ptr

我想做这样的事情:

class Exception : public std::exception {
    std::unique_ptr<Data> data;
public:
    Exception(std::unique_ptr<Data> d) : data(std::move(d)) {}
    std::unique_ptr<Data> getData() { return std::move(data); }
};

std::unique_ptr<Data> someFunction()
{
    std::unique_ptr<Data> data(new Data);
    if (error)
        throw Exception(std::move(data));
    else
        return data;
}

std::unique_ptr<Data> someOtherFunction()
{
    try
    {
        return someFunction();
    }
    catch (Exception &e)
    {
        if (ignore_errors)
            return e.getData();
        else
            throw;
    }
}

但这不能编译,因为Exception类不可复制。

使其可复制的一种方法是将其实现为:

class Exception : public std::exception {
    std::shared_ptr<std::unique_ptr<Data> > data;
public:
    Foo(std::unique_ptr<Data> d) : data(new std::unique_ptr<Data>(std::move(d))) {}
    std::unique_ptr<Data> getData() { return std::move(*data); }
};

但我觉得shared_ptrunique_ptr感到非常复杂。有更好的方法吗?

0 个答案:

没有答案