我必须遵循以下代码:
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'执行某些操作,以便在没有副作用的情况下重复使用它?
答案 0 :(得分:1)
一般来说,
boost::bind(&MyClass::fpp,
boost::ref
( { {1}} object))
和boost::function<>
非常适合存储绑定表达式:
std::function<>