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

标签 c++ c++11 lambda promise c++14

我想制作一个状态机,它可以在自己的线程中处理提交的信号。我使用 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/

相关文章:

c++ - 加载PVR,纹理问题

c++ - 如果最后一个地址是 0xFFFFFFFF,我如何获取一个数组末尾的地址?

c++ - 继承中调用构造函数/析构函数的顺序

c++ - 在 clang 和 gcc 中移动可分配的 lambda

python - dill vs cPickle 速度差异

c++ - 结构扩展结构的静态初始化

c++ - 未生成隐式移动函数

c++ - gcc std::unordered_map 实现速度慢吗?如果是这样 - 为什么?

c++ - 如何使用可变参数模板构建 switch-case

c++ - 转义 lambda 的示例代码