使用 std::bind 将成员函数传递给 boost::signals2::signal::connect() 是否安全?换句话说, boost::bind 和 std::bind 可以互换吗?
它使用 VC++ 2010 SP1 编译,但模板代码超出了我的想象,我担心我可能会冒险进入未定义的行为领域。
使用 std::bind 将成员函数传递给 boost::signals2::signal::connect() 是否安全?换句话说, boost::bind 和 std::bind 可以互换吗?
它使用 VC++ 2010 SP1 编译,但模板代码超出了我的想象,我担心我可能会冒险进入未定义的行为领域。
我在这个主题上没有经验,我希望connect
采取任何实现有效函数调用运算符的东西。使用与签名匹配的任何函数或函数对象调用它应该是安全的,无论是 boost::bind、std::bind 还是其他任何东西。Boost 库被设计为通用的,因此它们通常不会选择彼此的实现细节。
该connect
函数接受一个boost::function
对象,该对象基本上是一个通用包装器,围绕着任何为其operator()
定义的东西。因此,它与您绑定的内容一样安全。
例如,这是相当安全的:
boost::shared_ptr<ClassName> pValue = boost::make_shared<ClassName>(...);
signal.connect(boost::bind(&ClassName::FuncName, pValue, ...);
这是相当安全的,因为它将 aboost::shared_ptr
作为其数据的一部分存储。
ClassName *pValue = new ClassName(...);
signal.connect(boost::bind(&ClassName::FuncName, pValue, ...);
这是有条件的安全。如果该连接仍然存在并且您执行,它会立即变得不安全delete pValue
。
就个人而言,我不太相信“有条件的安全”,但这取决于你。关键是你绑定的所有东西都boost::bind
必须继续存在,只要它被绑定。