将指针连接到boost :: signals2

时间:2014-09-26 10:27:43

标签: c++ boost boost-signals2

我想知道是否有可能将指针连接到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的用途都有很好的理解。

2 个答案:

答案 0 :(得分:4)

你只需要ref - 包含你想要通过引用传递的仿函数(注意,在仿函数超出范围之前,你必须确保信号被断开)。

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

查看 Live On Coliru

答案 1 :(得分:0)

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