我想做这样的事情:
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_ptr
对unique_ptr
感到非常复杂。有更好的方法吗?