我正在尝试这样做:

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

这会引起问题吗?

连接c仅在连接后分配。

连接之前需要初始化lambda。

似乎无法按值(value)捕获。但是,我无法通过引用捕获,因为c只是局部变量。

如果不是lambda,则可以捕获“somesignal”,然后调用somesignal.disconnect(slot)。但是对于lambda,插槽本身就是。

最佳答案

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

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

(顺便说一句,与标题所暗示的相反,它实际上不是“自动断开连接”,而是手动断开连接。要自动断开插槽,可以使用the tracking mechanism。)

10-04 12:33