2

我想知道是否有可能以某种方式将指针连接到 boost::signals2::signal。对于我的问题如下:我希望更改连接到“信号”的对象。例如 :

class Something
{
    public:
        int x;
        bool operator()(std::string str)
        {
            std::cout << str << x << std::endl;
            return true;
        }
};


int main()
{
    boost::signals2::signal<bool (std::string)> sig;
    Something something;
    something.x = 3;
    Something* somethingElse = new Something;
    somethingElse->x = 3;
    sig.connect(something);
    sig.connect(*somethingElse); 

    something.x = 2;
    somethingElse->x = 2;

    sig("x is : ");
}

代码将始终输出:

x 是:3

我希望它输出

x 是:2

现在我觉得我错过了一些东西,要么是一个简单的解决方案,要么是对 boost::signals2 的用途有很好的理解。

4

2 回答 2

4

您只需要ref-wrap 要通过引用传递的函子(请注意,您必须确保在函子超出范围之前断开信号)。

Something something;
something.x = 3;

Something somethingElse;
somethingElse.x = 3;

sig.connect(something);
sig.connect(boost::ref(somethingElse)); 

something.x = 2;
somethingElse.x = 2;

sig("x is : ");

这将打印

x is : 3
x is : 2

在Coliru现场观看

于 2014-09-26T12:18:25.513 回答
0

在 C++ 中,存储对象的标准方式是“按值”。这意味着持有人创建原始价值的副本以避免依赖原始价值的生命周期。如果您需要存储一个对象的指针或引用,您应该创建一个具有显式引用捕获的代理持有者,并确保该引用将比持有者更有效。这通常是通过 boost::bind 来完成的,在 c++11 中它可以作为 std::bind 使用,现代方法是使用 lambda 函数和通过引用捕获。这个答案中给出了一个使用信号绑定的好例子。

于 2014-09-26T11:16:49.773 回答