使用boost :: signals2使用std :: bind是否安全?
问题描述:
使用std :: bind安全地传递一个成员函数来boost :: signals2 :: signal :: connect()?换句话说,boost :: bind和std :: bind是可以互换的吗?使用boost :: signals2使用std :: bind是否安全?
它使用VC++ 2010 SP1编译,但模板代码超出了我的脑海,恐怕我可能冒险进入未定义的行为领域。
答
的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
的所有东西都必须继续存在。
答
我没有经历过这个主题,我期望connect
采取任何实现有效的函数调用操作符。用任何匹配签名的函数或函数对象来调用它应该是安全的,无论是boost :: bind,std :: bind还是其他任何东西。 Boost库被设计成通用的,所以他们通常不会去选择其他的实现细节。