我想制作一个状态机,它可以在自己的线程中处理提交的信号。我使用 Visual Studio 2015,因此支持 C++11 和部分 C++14。 信号存储在容器中。每个信号都表示为一个 std::function。 我想从客户端等待状态机处理提交的信号,所以它是一种同步信号。
我的问题是:我无法将 std::promise 捕获到 lambda 中并将其添加到容器中。
#include <functional>
#include <future>
#include <list>
std::list<std::function<int()>> callbacks;
void addToCallbacks(std::function<int()>&& callback)
{
callbacks.push_back(std::move(callback));
}
int main()
{
std::promise<int> prom;
auto fut = prom.get_future();
// I have made the lambda mutable, so that the promise is not const, so that I can call the set_value
auto callback = [proms{ std::move(prom) }]() mutable { proms.set_value(5); return 5; };
// This does not compile
addToCallbacks(std::move(callback));
// This does not compile either, however this lambda is a temporal value (lvalue)
addToCallbacks([proms{ std::move(prom) }]() mutable { proms.set_value(5); return 5; });
return 0;
}
有什么解决办法
- 我想避免通过引用来捕获 promise
- 我想避免捕获指向 promise 的 * 指针或 shared_ptr
以某种方式将 promise 嵌入到 lambda 生成的类中会很好。这意味着 lambda 不再可复制,只能移动。有可能吗?
最佳答案
std::function
只能由可复制 的仿函数构造。来自 [func.wrap.func.con]:
template<class F> function(F f); template <class F, class A> function(allocator_arg_t, const A& a, F f);
Requires:
F
shall be CopyConstructible.
std::promise
是不可复制的,因此无法将具有此成员的仿函数粘贴到 std::function
中。期间。
鉴于您希望仿函数实际拥有 promise ,这并没有给您留下很多选择。几乎是 std::shared_ptr<std::promise>
。任何其他选项都不起作用(例如 std::unique_ptr<std::promise>
),留下悬空对象(例如 std::reference_wrapper<std::promise>
),或者留下内存管理问题(例如 std::promise*
)。
但是,您可以使用 std::function
以外的其他内容。你可以看看 Yakk 的 task
想法 here ,以及 dyp 的 function_mo
here ,它们都创建了 std::function
的可移动 flavor 。
关于c++ - 在 lambda C++14 中捕获 std::promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33436336/