gpt4 book ai didi

c++ - 在 C++11 中创建并返回包含 lambda 成员变量的类

转载 作者:行者123 更新时间:2023-11-30 02:20:22 25 4
gpt4 key购买 nike

我有以下包含 lambda 成员变量的类:

template <typename Callable>
class task {
private:
Callable lambda;

public:
task(Callable l) : lambda(l) {}

void execute() {
lambda();
}
};

现在我想创建一个函数,它接受任何类的对象和该类的成员函数指针,然后创建 lambda,从该 lambda 创建任务,最后返回任务。但是我无法弄清楚函数的返回类型:

template <typename C, typename F, typename ...Args>
/* return type ?*/ create_task(C& obj, F func, Args... args) {
auto l = [&obj, func, args...] {
(obj.*func)(args...);
};

task<decltype(l)> t {l};

return t;
}

这如何在 C++11 中完成?我也愿意接受其他建议,但他们必须在没有动态内存分配的情况下进行。

最佳答案

由于 C++11 中类型推导的工作方式的限制,您必须滚动自己的可调用对象而不是使用 lambda

template<typename C, typename F, typename... Args>
struct task
{
C* c;
F C::* f;
std::tuple<typename std::decay<Args>::type...> args;

task(C* c, F C::* f, Args&&... args)
: c{c}, f{f}, args{std::forward<Args>(args)...} {}

void execute()
{
auto l = [&](Args&... args) {
(c->*f)(args...);
};
std::apply(l, args);
}
};

template<typename C, typename F, typename... Args>
auto create_task(C& c, F C::* f, Args&&... args) -> task<C, F, Args...>
{
return {&c, f, std::forward<Args>(args)...};
}

std::apply 可以在 C++11 中实现,如 this .

关于c++ - 在 C++11 中创建并返回包含 lambda 成员变量的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49791260/

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