【问题标题】:Is it safe to use std::bind with boost::signals2?将 std::bind 与 boost::signals2 一起使用是否安全?
【发布时间】:2011-12-04 07:18:33
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      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 的所有东西都必须继续存在,只要它被绑定。

      【讨论】:

        猜你喜欢
        • 2020-08-03
        • 1970-01-01
        • 2015-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-25
        • 2018-04-14
        相关资源
        最近更新 更多