gpt4 book ai didi

c++ - 在 lambda C++14 中捕获 std::promise

转载 作者:可可西里 更新时间:2023-11-01 15:48:30 24 4
gpt4 key购买 nike

我想制作一个状态机,它可以在自己的线程中处理提交的信号。我使用 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 ,以及 dypfunction_mo here ,它们都创建了 std::function 的可移动 flavor 。

关于c++ - 在 lambda C++14 中捕获 std::promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33436336/

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