【发布时间】:2021-03-16 20:57:08
【问题描述】:
我正在尝试将 lambda 函数存储在队列中以便稍后执行它们。为了做到这一点,我试图在不丢失作用域的情况下将参数包隐藏在 lambda 中,这样我仍然可以在上层作用域中访问传递的参数。 遗憾的是,我无法编译它,因为参数包与 const 限定符不匹配。 我希望通过查看以下代码更容易理解我想要完成的工作。 (我使用的是 c++17,而不是 c++20)。 我想我误解了如何正确转发可变参数包,因为正如我现在所做的那样,对 const 的绑定引用将丢弃限定符。
很遗憾,不能期望函数式 lambda 中的参数为 const。
std::queue<std::function<void()>> fcts;
template<typename F >
auto push_fct(F &task) -> void {
// Do things
fcts.push(std::move(std::function<void()>(task)));
}
template<typename F, typename... A>
auto push_fct(F& task , A&... args) -> void {
push_fct( [task, args...] { task(args...);});
}
auto main() -> int {
auto functional = [&](class_a & a, class_b & b) {
a.memberFct();
b.memberFunction(123);
}
class_a instance_a;
class_b instance_b;
push_fct(functional, instance_a, instance_b);
return 0;
}
【问题讨论】:
-
重要的问题是,
instance_a和instance_b在 lambda 稍后执行之前是否存在,或者您是否要将它们的副本与 lambda 一起存储?或者这就是你所说的“不失范围”? -
对不起,如果我没有说清楚。仅当两个实例都存在且有效时才会执行 lambda。但是 lambda 是在另一个线程中调用的,所以我必须通过引用传递它们,这样我仍然可以访问成员函数
标签: c++