我想知道是否有可能将指针连接到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的用途都有很好的理解。
答案 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
答案 1 :(得分:0)
在c ++中,标准存储对象的方式是&#34;按值&#34;。这意味着持有者创建原始值的副本以避免依赖于原始值的生命周期。如果需要存储指针或对象的引用,则应创建具有显式引用捕获的代理持有者,并确保引用将超过持有者。这通常使用boost :: bind来完成,它在c ++ 11中可用作std :: bind,现代方法是使用lambda函数和引用捕获。在this回答中给出了使用绑定信号的一个很好的例子。