使用具有如下方法的库:
std::future<bool> action();
我发现自己处于必须遵守项目特定的情况enum
返回类型如:
enum Result { Ok, Failed, ConnectionDown, ServerError };
操作的调用站点如下所示:
std::future<Result> act()
{
try {
return _actor->action(); // This returns a different type :(
// What to do here ??? ^
}
catch (ConnectionError const& e)
{
return std::make_ready_future<Result>(Result::ConnectionError);
}
catch (ServerError const& e)
{
return std::make_ready_future<Result>(Result::ServerError);
}
}
因此本质上该库没有针对错误情况的特定返回代码,而是将它们作为异常发出。处理这个问题很容易,因为我可以构建具有适当值的现成 future 。问题(讽刺的是)出在非异常路径上,其中库的 std::future<bool>
必须转换为std::future<Result>
.
.get()
毫无意义结果并根据其值构建一个就绪的 future (true -> Ok,false -> Failed),因为这样我就可以从函数中消除异步性。有没有更好的方法来处理这个问题?
最佳答案
等待继续函数 ( std::experimental::future::then
)
,你可能想要这样的东西:
std::future<Result> act()
{
return std::async([&](){
try {
if (_actor->action().get()) {
return Result::Ok;
} else {
return Result::Failed;
}
}
catch (ConnectionError const& e) {
return Result::ConnectionError;
}
catch (ServerError const& e) {
return Result::ServerError;
}
});
}
关于c++ - future 的类型有可能转变吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69494265/