c++ - boost::future::那么它是如何实现的呢?

标签 c++ templates boost

我在其他语言(javascript、python)中大量使用 future ,尤其是延续(当时),最近了解到类似的东西也可以在 c++ 中使用。例如像这样:

#include <iostream>
#include <string>
#define BOOST_THREAD_PROVIDES_FUTURE
#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
#include <boost/thread/future.hpp>
using namespace boost;

int main() {
    future<int> f1 = async ([]() { sleep (1); return 123; });
    future<std::string> f2 = f1.then ([](future<int> f) {
        std::cout << f.get() << std::endl;
        sleep (1);
        return std::string ("foo");
    });
    f2.then ([](future<std::string> f) {
        std::cout << f.get () << std::endl;
    });
    sleep (3);
}

我的目标是了解这是如何实现的,所以我在这里寻找:
https://github.com/boostorg/thread/blob/develop/include/boost/thread/future.hpp .
发生了很多事情,我想我理解了其中的大部分内容,但是关于所有这些模板魔术的一些具体细节我不理解,也无法在代码中找到。

f1.then()被称为它基于回调的返回类型创建一个新的 future (f2)。如果我理解正确,回调实际上存储在 f2.当 f1 设置一个结果时,它“激活” f2 反过来调用回调并使用返回值来设置它自己的结果。我认为相关的电话发生在这里:
https://github.com/boostorg/thread/blob/develop/include/boost/thread/future.hpp#L4500
似乎 f2 有一个 continuation_shared_state内部包含对 f1 (父)的引用,但我不明白这是如何完成的。 f2 的类型只是 future<std::string>不是 future<std::string, int>future<std::string, future<int>> .父 future 的类型不是新 future 类型的一部分,但它仍然存储在其中。这是怎么做到的?

谢谢!

最佳答案

它是通过一种称为“类型删除”的技术完成的。
这不是在 boost 实现中实际完成的方式,但基本上是:f2包含一个对象,它是一个无模板类型,具有在派生模板类型中实现的虚拟方法。这个派生的模板类型依赖于“当前” future 和父 future 的类型——>意味着它保持f1之间的链接。和 f2没有任何一个直接了解对方。

关于c++ - boost::future::那么它是如何实现的呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57567498/

相关文章:

c++ - 当一个类型有额外的修饰符时会发生什么?

c++ - vector< vector<Point3f>> 中的最高值

c++ - 我可以强制可变参数模板采用特定类型的参数吗

c++ - 预期类型说明符

c++ - Boost 库在 Windows 上未正确链接

c++ - 如何存储可变类型的参数?

c++ - 为什么 STL 类不为右值重载 swap()?

c++ - C memset 似乎没有写给每个成员

C++、海湾合作委员会 : avoid evaluation of useless expressions

c++ - 如何使用 boost::future 重新抛出 std::exception_ptr 存储的原始异常?