Я должен следовать следующему коду:
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 (& some_callback). Я не хочу этого делать, потому что это кажется пустой тратой процессора.
Я хотел бы сделать вызов boost :: bind один раз, а затем повторно использовать все, что он вернул при последующем вызове функции create(). Я не уверен, может ли это работать. Я могу себе представить, что это приведет к утечке памяти и еще хуже, к использованию освобожденной памяти и сбоя или чего-то еще.
Я думаю, что приведенное выше должно быть достаточной информацией, чтобы дать общий ответ, но позвольте мне добавить информацию о том, что именно делает эта функция "create".
Эффект вызова create() заключается в том, что объект "Signal" создается с новым, где Signal:
struct Signal {
signal_type mSignal;
};
и затем mSignal подключается к значению слота, переданному для создания:
mCallback = new Signal;
mCallback->mSignal.connect(slot);
Когда мне нужно "перезапустить" таймер (до истечения срока его действия), я сначала вызываю функцию cancel(), а затем снова вызываю create(). Функция cancel() эффективно вызывает "delete 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;
}
Это разрешено или звонки "подключиться" и "удалить" делают что-то "слот", поэтому я не могу повторно использовать его без побочных эффектов?
В целом,
boost::bind(&MyClass::fpp,
boost::ref
( object))
boost::function<>
и std::function<>
идеально подходят для хранения связанных выражений:
boost::function<void()> stored_bind =
boost::bind(&MyClass::fpp, boost::ref(object));
boost::bind
выполняется во время компиляции; Вы не платите за дополнительные циклы процессора, чтобы связать его снова.