使用std :: bind和boost :: signals2是否安全?

时间:2011-10-10 07:12:06

标签: c++ boost bind signals member-functions

使用std :: bind将成员函数传递给boost :: signals2 :: signal :: connect()是否安全?换句话说,boost :: bind和std :: bind是否可以互换?

它使用VC ++ 2010 SP1进行编译,但模板代码已经超出我的想象,我担心我可能会冒险进入未定义的行为领域。

2 个答案:

答案 0 :(得分:2)

我对这个主题没有经验,我希望connect能够采取任何实现有效函数调用运算符的东西。使用与签名匹配的任何函数或函数对象调用它应该是安全的,无论是boost :: bind,std :: bind还是其他任何东西。 Boost库被设计为通用的,因此他们通常不会选择彼此的实现细节。

答案 1 :(得分:1)

connect函数接受一个boost::function对象,它基本上是围绕任何的通用包装器,其中定义了operator()。因此,它与你的约束力一样安全。

例如,这是相当安全的:

boost::shared_ptr<ClassName> pValue = boost::make_shared<ClassName>(...);
signal.connect(boost::bind(&ClassName::FuncName, pValue, ...);

这是相当安全的,因为它存储boost::shared_ptr作为其数据的一部分。

ClassName *pValue = new ClassName(...);
signal.connect(boost::bind(&ClassName::FuncName, pValue, ...);

这是有条件安全。如果该连接仍然存在并且您执行delete pValue

,它立即变得不安全

就个人而言,我对“条件安全”并不太信任,但这取决于你。重点是,绑定到boost::bind的所有内容必须继续存在,只要它被绑定。