C++ 创建任务然后函数(比如std::future.Then)

C++ 创建任务然后函数(比如std::future.Then),c++,c++11,C++,C++11,由于我们可能需要等待一段时间,直到实现了std::future::然后,所以我正在尝试编写一个非常简单的任务包装器,问题是调用回调函数。假设我们有这样一个类: template<typename... ARG> class Task { public: typedef std::function<void(ARG...)> task_func_t; Task() {} void then(task_func_t callback) { this

由于我们可能需要等待一段时间,直到实现了
std::future::然后
,所以我正在尝试编写一个非常简单的任务包装器,问题是调用回调函数。假设我们有这样一个类:

template<typename... ARG>
class Task
{
public:
    typedef std::function<void(ARG...)> task_func_t;

    Task() {}

    void then(task_func_t callback) { this->callback_ = callback; }

    void finish(ARG... arguments)
    {
        this->callback_(std::forward<ARG>(arguments)...);
    }

    void operator()(ARG... arguments)
    {
        this->callback_(std::forward<ARG>(arguments)...);
    }

private:
     task_func_t callback_;
};

因此,当在中完成链接时,它将调用create线程。完美的解决方案是将
然后调用
作为需求,但我认为只要我想要这种设计,实际上是不可能的。

您可以等待条件变量。使其成为任务类的成员,并在设置函数后向其发送信号

对于future,您可以做如下操作:
then
implementation from)

模板
自动然后(未来工作)->标准::共享的未来
{
返回std::async([=]{w(f.get());});
}
标准::共享的未来总和(整数a、整数b)
{
返回std::async([](inta,intb){returna+b;},a,b);
}
int main(){

然后(sum(40,2),[](int n){std::cout
sum
返回一个悬空引用?是的,你是对的。我只是从头开始在这里键入代码。当我以这种方式测试它时,我返回了ptr。但是当我使用{before,then}概念时,我是这样做的。不要返回
*ptr.get()
,return
ptr
这会阻塞线程,并且长时间得不到返回。我正在使用boost asio,我正在为它开发一个http包装器,我认为巨大的函数参数对此并不方便。而且我必须等待响应,我必须等待很长时间的答案。我很惊讶这将如何实现。是的我希望头顶不会痛,但这似乎是个好办法。
std::shared_ptr<Task<int>> sum(int n1, int n2)
{
    auto ptr = std::make_shared<Task<int>>();
    myPool.process([n1, n2, ptr]
    {
        (*ptr.get())(n1 + n2);
    }
    return ptr;
}

void test()
{
    sum(5, 6)->then([](int sum) { std::cout << "Sum is " << sum << std::endl };
}
return task.before(do prepare work);

.then(process result)
template <typename Fut, typename Work>
auto then(Fut f, Work w) -> std::shared_future<decltype(w(f.get()))>
{
    return std::async([=]{ w(f.get()); });
}

std::shared_future<int> sum(int a, int b)
{
    return std::async([](int a, int b) { return a + b; }, a, b);
}

int main() {
    then(sum(40, 2), [](int n) {std::cout << "Sum is " << n << std::endl;}).wait();
    return 0;
}