由于我们可能需要等待一段时间才能实现std::future::then
我正在尝试编写一个非常简单的任务包装器,问题是调用回调函数。让我们说我们有一个类:
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_;
};
并假设以下用法:
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)
那么那么当链接完成时它会调用创建线程。完美的解决方案是在需要之前调用then
的东西,但我认为只要我想要这个设计它就不可能。
答案 0 :(得分:1)
您可以等待条件变量。使其成为任务类的成员,并在设置功能后发出信号。
答案 1 :(得分:1)
对于未来,你可能会做类似的事情:
(implementing-futurethen-equivalent-for-asynchronous-execution-in-c11)then
实施
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;
}