重用 boost::bind 调用的返回值的正确方法是什么?

What is the correct way to reuse the return value of a boost::bind call?

本文关键字:方法 是什么 返回值 bind 调用 重用 boost      更新时间:2023-10-16

我必须遵循以下代码:

class Timer;
typedef boost::signals2::signal<void (void)> signal_type;
void Timer::create(long expiration, signal_type::slot_type const& slot);

它的正常用法是调用,

timer.create(2000, boost::bind(&some_callback));

并且工作正常。

但是,现在我需要"重新启动"这个计时器很多,这将需要大量调用来提升::bind(&some_callback) - 我不想这样做,因为这似乎浪费了CPU。

我想调用一次 boost::bind 然后重用它在后续调用 create() 函数时返回的任何内容。我不确定这是否可行。我可以想象它会泄漏内存,更糟糕的是,使用释放的内存并崩溃或其他什么。

我认为以上应该有足够的信息来给出一个一般的答案,但让我添加有关这个"创建"函数究竟是什么的信息。

调用 create() 的效果是使用新的、其中信号是:

struct Signal {
    signal_type mSignal;
};

然后将 mSignal 连接到传递以创建以下内容的插槽值:

mCallback = new Signal;
mCallback->mSignal.connect(slot);

当我必须"重新启动"计时器(在它过期之前)时,我首先调用一个cancel()函数,然后再次调用create()。函数取消()有效地调用"删除mCallback" - 因此,不执行任何其他操作而不是释放由上面的"new"调用分配的内存。

因此,我想存储 boost::bind 的返回值并有效地重复使用它归结为:

signal_type::slot_type slot(boost::bind(&callback));
while (--several_times)
{
  signal_type* signal = new signal_type;
  signal->connect(slot);
  delete signal;
}

这是允许的,还是对"连接"和删除的调用对"插槽"做了一些事情,所以我不能在没有副作用的情况下重复使用它?

一般来说,

  • 绑定表达式非常轻量级(编译器通常会内联整个 shebang)
  • 绑定
  • 表达式确实会复制其绑定参数,但这很容易通过boost::bind(&MyClass::fpp, boost::refobject))
  • boost::function<>std::function<> 非常适合存储绑定表达式:

    boost::function<void()> stored_bind = 
          boost::bind(&MyClass::fpp, boost::ref(object));