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

时间:2014-11-14 22:45:38

标签: c++ boost boost-bind boost-signals2

我必须遵循以下代码:

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));

并且工作正常。

然而,现在我需要'重启'这个计时器很多,这需要很多调用boost :: bind(&amp; some_callback) - 我不想这样做,因为这似乎是浪费CPU。

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

我认为以上内容应该是提供一般性答案的充分信息,但是让我添加一些关于这个“创建”功能的信息。

调用create()的效果是使用new创建一个对象'Signal', 信号是:

struct Signal {
    signal_type mSignal;
};

然后mSignal连接到传递给create的插槽值:

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

当我必须'重新启动'计时器(在它到期之前)时,我先打电话 一个cancel()函数,然后再次调用create()。功能取消() 有效地调用'删除mCallback' - 所以,不做任何其他事情 而不是释放上面“新”调用分配的内存。

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

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

这是允许的,还是调用'connect'并删除对'slot'执行某些操作,以便在没有副作用的情况下重复使用它?

1 个答案:

答案 0 :(得分:1)

一般来说,

  • 绑定表达式非常轻量级(编译器通常会内联整个shebang)
  • 绑定表达式执行复制绑定参数这可以轻松减轻boost::bind(&MyClass::fpp, boost::ref { {1}}
  • object))boost::function<>非常适合存储绑定表达式:

    std::function<>