是否有可能改造未来类型?

Is it possible to transform a future type?

使用具有类似方法的库:

std::future<bool> action();

我发现自己处于必须符合项目特定 enum return 类型的情况,例如:

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

所以基本上库没有针对错误情况的特定 return 代码,它们是作为异常发出的。处理起来很容易,因为我可以构建具有适当价值的现成期货。问题(具有讽刺意味的是)与非例外路径有关,其中图书馆的 std::future<bool> 必须转换为 std::future<Result>.

.get() 结果并根据它的值(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;
        }
    });
}