gpt4 book ai didi

c++ - 创建一个函数对象的packaged_task

转载 作者:行者123 更新时间:2023-11-30 03:14:18 24 4
gpt4 key购买 nike

如何创建函数对象的packaged_task

例如,

class TaskA {
public:
std::function<int(void)> func;
TaskA(std::function<int(void)>&f) : func(f) {}
int res;
int operator()() {
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
return func();
}
};

现在先创建一个函数对象:

std::function<int(void)> func1 = xy; // xy is some function
TaskA task1(func1);

现在我有一个函数将此函数对象作为参数,创建一个 packaged_task 并返回一个 future 。

template<typename TaskType>
auto handle(TaskType func) -> std::future</*correct syntax ?*/>
{
auto task = std::packaged_task</*correct syntax ?*/>(std::move(func));
/* correct syntax ? */
auto futur = task.get_future();

// do something with the task

return std::move(futur);
}

然后按如下方式使用此句柄函数:

auto x = handle(task1);

能否请您帮助我了解 future 以及 packaged_task 声明的正确语法?

谢谢!

最佳答案

这使用元函数来推导签名。请注意,我没有使用其他类型的可调用对象对此进行测试,因此虽然它应该适用于任何具有 operator() 的内容,但它可能需要对其他类型的可调用对象进行一些处理。

#include <functional>
#include <future>

class TaskA {
public:
int operator()() { return 0; }
};

template <typename T>
struct function_signature
: public function_signature<decltype(&T::operator())>
{};

template <typename ClassType, typename ReturnType, typename... Args>
struct function_signature<ReturnType(ClassType::*)(Args...)> {
using type = ReturnType(Args...);
};

template<typename TaskType>
auto handle(TaskType func)
{
using signature = typename function_signature<TaskType>::type;
auto task = std::packaged_task<signature>(std::move(func));

auto futur = task.get_future();

// do something with the task

return std::move(futur);
}

int main() {
TaskA task1;
handle(task1);
}

关于c++ - 创建一个函数对象的packaged_task,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57933417/

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