增强信号自动断开lambda插槽

时间:2014-03-14 09:23:03

标签: c++ boost lambda boost-signals2

我正在尝试这样做:

boost::signals::connection c = somesignal.connect(
[c]()->void{
    // Do something
    c.disconnect();
})

这会导致问题吗?

连接c仅在连接后分配。

lambda需要在连接之前初始化。

似乎按价值捕获不起作用。但是,我无法通过引用捕获,因为c只是一个局部变量。

如果它不是lambda,我可以捕获“somesignal”,并调用somesignal.disconnect(slot)。但是在lambda的情况下,插槽本身就是。

1 个答案:

答案 0 :(得分:1)

使用扩展槽,Signals2将连接对象传递给它。它的设计primarily for thread-safety,但您也可以将它用于您的目的:

somesignal.connect([](const connection &c)->void 
{
  // Do something
  c.disconnect();
});

(顺便说一句,与标题所暗示的相反,它实际上不是"自动断开",而是手动断开。要自动断开插槽,可以使用{{ 3}}。)