gpt4 book ai didi

c++ - std::async "store"如何成为任意异常?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:28:25 27 4
gpt4 key购买 nike

我无法理解 std::async 怎么可能存储任何异常,而不仅仅是从 std::exception 派生的东西。我玩弄了下面的代码

#include <iostream>
#include <future>
#include <chrono>

void f()
{
std::cout << "\t\tIn f() we throw an exception" << std::endl;
throw 1; // throw an int
}

int main()
{
std::future<void> fut = std::async(std::launch::async, f);
std::cout << "Main thread sleeping 1s..." << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1)); // sleep one second
std::cout << "Main thread waking up" << std::endl;
try
{
fut.get();
}
catch(...)
{
std::cout << "We caught an exception!" << std::endl;
throw; // rethrow
}
}

我异步启动 f(),然后在 f 中抛出一个 int。神奇的是,这个 intstd::async 返回的 future 捕获并存储。我知道可以在 std::asynccatch(...) 异常,但后者如何在不知道异常类型的情况下存储它?异常不是从某个基类派生的(在这种情况下,可能可以通过一些 Base::clone 来“克隆”它),但可以是任何异常。我们能否以某种方式神奇地“推断”出异常类型?

总而言之,我的问题是:

我们如何在不知道异常类型的情况下将任意异常存储在对象中,然后在稍后重新抛出它?

最佳答案

std::async 可以在 std::threadstd::packaged_task 之上实现。

std::packaged_task 可以(部分)在 std::exception_ptr 和相关函数(线程退出就绪函数除外)之上实现。

std::exception_ptr 和相关函数不能用 C++ 编写。

关于c++ - std::async "store"如何成为任意异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28685117/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com