c++ - future 的类型有可能转变吗?

标签 c++ multithreading c++17

使用具有如下方法的库:

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/

相关文章:

c - OpenMP 线程处理的迭代索引

java - 实时更新 ListView JavaFX

c++ - 在 C++17 中使用空列表初始化构造函数时出现编译错误

c++ - 折叠表达式和参数包 : difference betwen Args&& and Args inside static_assert

java - 当线程在 Synchronized block 内崩溃时,锁会发生什么情况?

c++ - 返回具有未初始化成员的内联定义结构。 C++

c++ - 容器的访问比较器(C++/STL)

java - 对于包含名为 "Node"的类的 JNI C++ 代码,JVM 无法按预期工作

python - 为什么我的 Python NumPy 代码比 C++ 更快?

c++ - 如何跟踪调用析构函数的位置 - C++